Как я могу выполнить List <object>.Cast <T> с использованием отражения, когда T неизвестно

Я пытался сделать это в течение нескольких часов, и это до тех пор, пока у меня есть

var castItems = typeof(Enumerable).GetMethod("Cast")
                  .MakeGenericMethod(new Type[] { targetType })
                  .Invoke(null, new object[] { items });

Это возвращает меня

System.Linq.Enumerable + d__aa`1 [MyObjectType]

тогда как мне (для моего ViewData) нужен общий список i.e.

System.Collections.Generic.List`1 [MyObjectType]

Любые указатели будут большими

Ответ 1

Вам просто нужно вызвать ToList() на нем потом:

static readonly MethodInfo CastMethod = typeof(Enumerable).GetMethod("Cast");
static readonly MethodInfo ToListMethod = typeof(Enumerable).GetMethod("ToList");

...

var castItems = CastMethod.MakeGenericMethod(new Type[] { targetType })
                          .Invoke(null, new object[] { items });
var list = ToListMethod.MakeGenericMethod(new Type[] { targetType })
                          .Invoke(null, new object[] { castItems });

Другим вариантом было бы написать один общий метод в вашем собственном классе, чтобы сделать это, и называть это с отражением:

private static List<T> CastAndList(IEnumerable items)
{
    return items.Cast<T>().ToList();
}

private static readonly MethodInfo CastAndListMethod = 
    typeof(YourType).GetMethod("CastAndList", 
                               BindingFlags.Static | BindingFlags.NonPublic);

public static object CastAndList(object items, Type targetType)
{
    return CastAndListMethod.MakeGenericMethod(new[] { targetType })
                            .Invoke(null, new[] { items });
}