[英]LINQ Select() or ForEach loop
我是仿制葯的新手,但我知道我需要用它來幫助保持干燥:)
我正在嘗試創建一個類,該類將許多不同類型的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)
});
}
更短(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!"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.