![](/img/trans.png)
[英]Force IEnumerable<T> to evaluate without calling .ToArray() or .ToList()
[英]Calling IEnumerable<T> ToList() at runtime
我有一个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());
你必须将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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.