在运行时调用IEnumerable <t> ToList()</t>

时间:2012-12-31 21:09:28

标签: c# .net generics

例如我有一个IEnumerable<Person>

我希望能够在运行时将其List<Person>

我有以下代码,但错误说我无法转换系统运行时类型

我有什么遗失的吗?

private static readonly MethodInfo enumerableToListMethod = typeof(Enumerable).GetMethod("ToList", BindingFlags.Public | BindingFlags.Static);

//genericType will be Person
var genericType = modelType.GetGenericArguments().First();

var genericToListMethod = enumerableToListMethod.MakeGenericMethod(new[] { genericType });

//modelType is IEnumerable<Person>
var ienumtype = genericToListMethod.Invoke(null, new object[] { modelType });

Activator.CreateInstance(ienumtype.GetType());

1 个答案:

答案 0 :(得分:2)

你必须将IEnumerable传递给invoke,而不是枚举的类型 - 同样,调用invoke将返回List,而不是Type。

输入代码:

var instance = < the IEnumerable >;
var modelType = instance.GetType();

//modelType is IEnumerable<Person>
var enumerableAsList = genericToListMethod.Invoke(null, new object[] { instance});

根据你的评论,我猜你是在追求更像这样的东西:

Func<IEnumerable<T>, List<T>> MakeMeAToListerForEnumerablesOfType<T>()
{
    var itemType = typeof(T);
    var enumerableToListMethod = typeof(Enumerable).GetMethod("ToList", BindingFlags.Public | BindingFlags.Static);
    var genericToListMethod = enumerableToListMethod.MakeGenericMethod(new[] { itemType });
    return (Func<IEnumerable<T>, List<T>>)Delegate.CreateDelegate(typeof(Func<IEnumerable<T>, List<T>>), genericToListMethod);
}

您可以这样称呼:

IEnumerable<string> enumerable = new string[] { "a", "b", "c" };
var toLister = MakeMeAToListerForEnumerablesOfType<string>();

DERP。错过了电话......

var enumerableAsList = toLister(enumerable);
相关问题