2012-12-31 37 views
0

例如,我有一個IEnumerable<Person>調用IEnumerable <T>運行時ToList()

我希望能夠使它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()); 

回答

2

您在IEnumerable的得通的調用,而不是枚舉類型 - 也叫調用將返回列表,而不是一個類型。

放代碼:

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); 
+0

有道理,但我沒有在這一點上的實例。回到繪圖板 – Jon

+0

你在這一點上有什麼? – JerKimball

+0

只是不幸的類型 – Jon

相關問題