我是泛型新手,但知道我需要使用它们来使事物保持干燥:)

我正在尝试创建一个类,该类将许多不同类型的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/

10-13 03:31