【发布时间】:2013-01-05 16:58:29
【问题描述】:
我有下面的代码示例,我想在源参数的前面添加prepend 一些文本,这些文本可以是ISite 或IFactory 类型,通过MoreLinq extension 在MVC 下拉列表中使用.该函数用于控制器操作,该操作返回序列化为 JSON 的列表,以便可以使用一些下拉级联动态加载它,否则我会在视图模型中单独执行此操作。
我想知道是否有一种方法可以在不必创建具体的 ListItem 类的情况下执行类似于下面的操作,我的示例显示了我如何使用as 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;
}
}
【问题讨论】:
标签: c# asp.net-mvc-3 linq c#-4.0