c# – 将匿名类型添加到Enumerable

我有下面的代码示例,其中我想要prepend一些文本到源param的前面,可以是通过MoreLinq extension在MVC下拉列表中使用的ISite或IFactory类型.此函数用于返回的控制器操作列表序列化为JSON,以便可以使用一些下拉级联动态加载,否则我会在视图模型中单独完成.

我想知道是否有办法能够做类似于下面的事情,而不必创建一个具体的ListItem类,我的例子显示我如何使用IListItem,但我知道这将无法编译.

目前我的控制器没有我的任何模型的具体类的概念,我有点想保持这种方式,我不确定我是否肯定需要创建一个ListItem的实例来使这项工作或任何人有另一个建议?

我对泛型中协方差和逆变的知识是有限的,如果在这里很重要的话?谢谢

    public interface IListItem
    {
        int Id { get; set; }
        string Name { get; set; }
    }

    public interface ISite : IListItem
    {
        int CountryId { get; set; }
    }

    public interface IFactory : IListItem
    {
        int SiteId { get; set; }
    }

    public interface IResource
    {
        int Id { get; set; }
        string Name { get; set; }
        int ContentID { get; set; }
        string Text { get; set; }
        int LanguageID { get; set; }
        string LanguageCode { get; set; }
        int Priority { get; set; }
    }

private IEnumerable<IListItem> PrependSelectionResource(IEnumerable<IListItem> source, string languageCode)
{
    if(source == null || source.Count() == 1)
        return source; // don't bother prepending the relevant resource in these cases

    try
    {
        // will throw an exception if languageCode is null or blank
        var resource = _resourceRepository.GetByNameAndLanguageCode(
            "Prompt_PleaseSelect",
            languageCode);

        if(resource == null)
            return source;

        // prepend the "Please Select" resource to the beginning of the source
        // using MoreLinq extension
        return source.Prepend(new {
            Id = 0,
            Name = resource.Text ?? ""
        } as IListItem);
    }
    catch {
        return source;
    }
}
最佳答案
不幸的是,你无能为力.您必须将实现IListItem接口的类的具体实例传递给Prepend方法.

如果您担心在应用程序的其他位置公开实现,则可以为文件创建一个名为PlaceholderListItem的本地实现,并使用它.

转载注明原文:c# – 将匿名类型添加到Enumerable - 代码日志