我是第一次接触泛型,但我知道我需要使用它们来帮助保持事物的完整性:)
我正在尝试创建一个类,将许多不同类型的列表转换为一个通用类,该类由dropdownlist控件使用,但无法使其工作。我在下面的方法中展示了两个尝试的选项,试图让每个选项都能工作(一个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
};
}发布于 2012-12-19 12:09:07
甚至更短(也是LINQ),一行和一个扩展方法:
public static IEnumerable<DdlOption> ToDdlOption<T>(this IEnumerable<T> genericList, string strPropName)
{
return genericList.Select(l => new DdlOption
{
Id = l.Id,
DisplayName = l.strPropName
});
}另外,我会用大写字母命名一个类,并避免复数形式。
并且不要忘记通过调用ToArray()或ToList()来物化任何LINQ查询结果。
要将属性名称转换为以lambda表达式为目标的属性:
public static Func<T, object> ToLambda<T>(this string propertyName)
{
ParameterExpression param = Expression.Parameter(typeof(T), "x"); // x
Expression property = Expression.Property(param, propertyName); // x.PropertyName
Func<T, object> lambda = Expression.Lambda<Func<T, object>>( // x => x.PropertyName
Expression.Convert(property, typeof(object)),
param)
.Compile();
return lambda;
}用法:
// assuming class X { public string PropertyName { get; set; }
var lambda = "PropertyName".ToLambda<X>()
var x = new X { PropertyName = "Hi!" };
string value = lambda(x); // "Hi!"https://stackoverflow.com/questions/13945317
复制相似问题