LINQ Select()或ForEach循环

Cha*_*son 2 c# linq generics foreach

我是仿制药的新手,但我知道我需要用它来帮助保持干燥:)

我正在尝试创建一个类,将许多不同类型的列表转换为由下拉列表控件使用但不能使其工作的公共类.我在下面的方法中显示了两个尝试这个的选项,试图让每个工作(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
           };
}
Run Code Online (Sandbox Code Playgroud)

Ian*_*cer 5

您可以使用接口来约束T包含Id属性,并且您可以使用a 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)
    });
}
Run Code Online (Sandbox Code Playgroud)