Linq从通用<t>列表中动态选择

时间:2018-08-01 10:59:46

标签: c# linq reflection

我想从我的List<T>获取每个对象的列表(字符串,整数等除外)。然后调用(带反射的通用递归方法)。问题是我正在遍历属性名称,却不知道如何选择。

  

错误CS0021无法将带有[]的索引应用于类型'T'的表达式

代码:

public static void My method<T>(IEnumerable<T> query)
{
    var t = typeof(T);
    var Headings = t.GetProperties();

    for (int i = iteratorStart; i < Headings.Count(); i++)
    {
        if (IsValue(Headings[i].PropertyType.FullName))
        {
        }
        else
        {
           Type type = Type.GetType(Headings[i].PropertyType.FullName);
           var mi = typeof(ExcelExtension);
           var met  = mi.GetMethod("ListToExcel");
           var genMet = met.MakeGenericMethod(type);

           var nested = query.Select(p => p[Headings[i].Name]);

           object[] parametersArray = new object[] { pck, nested, i };
           genMet.Invoke(null, parametersArray);
        }
    }
}

2 个答案:

答案 0 :(得分:0)

据我所知,这就是您想要的:

public static void Mymethod<T>(IEnumerable<T> query)
{
    var t = typeof(T);
    int pck = 1234;

    var mi = typeof(ExcelExtension);
    var met = mi.GetMethod("ListToExcel");

    var Headings = t.GetProperties();
    for(int i=0; i < Headings.Length; ++i)
    {
        var prop = Headings[i];
        if (prop.PropertyType.IsClass)
        {
            var genMet = met.MakeGenericMethod(prop.PropertyType);

            var nested = query.Select(p => prop.GetValue(p));

            object[] parametersArray = new object[] { pck, nested, i };
            genMet.Invoke(null, parametersArray);
        }
    }

}


class ExcelExtension
{
    public void ListToExcel<T>(int pck, IEnumerable<object> nested, int i)
    {

    }
}

答案 1 :(得分:-1)

假设您使用的是c#6.0或更高版本。您可以使用通用类型参数,例如;

public static void MyMethod<T>(IEnumerable<T> query) where T : IList
{
    //Your code here
}

这样,您可以确保T是某物的清单,并且到达索引不会成为问题。

更新

我之前误解了这个问题。这是更新的解决方案。

    public static void MyMethod<T>(IEnumerable<T> query)
    {
        var t = typeof(T);
        var Headings = t.GetProperties();
        for (int i = iteratorStart; i < Headings.Count(); i++)
        {
            if (false == IsValue(Headings[i].PropertyType.FullName))
            {
               Type type = Type.GetType(Headings[i].PropertyType.FullName);
               var mi = typeof(ExcelExtension);
               var met  = mi.GetMethod("ListToExcel");
               var genMet = met.MakeGenericMethod(type);
               //Assuming you want to get property value here. IF not You can use like Headings[i].GetName
               var nested = query.Select(p =>Convert.ChangeType( Headings[i].GetValue(p),Headings[i].GetType()));
               object[] parametersArray = new object[] { pck, nested, i };
               genMet.Invoke(null, parametersArray);
            }
        }

}

错误说明: 问题出在Select(p => p[something here])部分。由于p不是属性列表或数组而是对象的类型,因此它不包含任何索引器。您应该像上面的示例一样使用反射。