我是泛型新手,但知道我需要使用它们来使事物保持干燥:)
我正在尝试创建一个类,该类将许多不同类型的List转换为dropdownlist控件使用的通用类,但无法使其正常工作。我在下面的方法中显示了2个尝试此操作的选项,试图使每个选项都起作用(一个foreach循环和一个linq),但无济于事。
private static IEnumerable<ddlOptions> GetDDLOptionsViewModel<T>(List<T> genericList, string strPropName)
{
// option A: ForEach loop
Type type = genericList.GetType();
var IdProperty = type.GetProperty("Id");
var DisplayNameProp = type.GetProperty(strPropName);
List<ddlOptions> options = new List<ddlOptions>();
foreach (var l in genericList)
{
options.Add(new ddlOptions
{
Id = IdProperty.GetValue(l, null),
DisplayName = DisplayNameProp.GetValue(l, null)
});
}
return options;
// option B - LINQ
return from l in genericList
select new ddlOptions
{
Id = l.Id,
DisplayName = l.strPropName
};
}
最佳答案
您可以使用接口来约束T
以包含Id
属性,并且可以使用Func<T,string>
来访问类型T的对象的所有给定属性,同时保留类型安全性并避免反射:
public interface IId
{
string Id {get;}
}
private static IEnumerable<ddlOptions> GetDDLOptionsViewModel<T>
(IEnumerable<T> list, Func<T,string> propAccess)
where T:IId
{
return list.Select(l => new DdlOption
{
Id = l.Id,
DisplayName = propAccess(l)
});
}
关于c# - LINQ Select()或ForEach循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13945317/