![](/img/trans.png)
[英]Create instance of class with generic type and call method of same generic type from string name of object at runtime
[英]Create list of runtime-known type from object list and call generic method
我在內存中有IEnumerable<object>
。
這么說吧:
IEnumerable<object>() addedEntities = // ... some Linq-To-Object query
另外,我有一個帶有此簽名的方法:
public static IEnumerable<TSource> FilterByUniqueProp<TSource>
(this IEnumerable<TSource> query, TSource model)
{
// Do something according to this type
var type = model.GetType();
}
如您所見,這是一種擴展方法。 因此,我無法動態調用它,我必須使用MethodInfo
在運行時執行它。
在運行時中,我必須為某個運行時已知類型的Enumerable<T>
動態調用此方法。 但是,不管我做什么,都行不通。 model.GetType()
始終為Object
或拋出異常。
類型'System.Linq.Enumerable + WhereSelectArrayIterator
2[System.Data.Objects.ObjectStateEntry,System.Object]' cannot be converted to type System.Collections.Generic.IEnumerable
1 [PersonDetail]'。
這是我嘗試過的:
IEnumerable<object>() addedEntities = // ... some Linq-To-Object query
Type listType = typeof(List<>);
Type constructed = listType.MakeGenericType(model.GetType());
dynamic myList = Activator.CreateInstance(constructed);
myList = addedEntities;
MethodInfo mesthod = typeof(DynamicLinqExtensions).GetMethod("FilterByUniqueProp");
MethodInfo genericMethod= mesthod.MakeGenericMethod(model.GetType());
dynamic sameEntitiesInContext = genericMethod.Invoke(this, new object[] { myList, model });
很簡單:
public static class DynamicLinqExtensions
{
public static IEnumerable<TSource> FilterByUniqueProp<TSource>
(this IEnumerable<TSource> query, TSource model)
{
// Do something accourding to this type
var type = typeof(TSource);
return null;
}
public static IEnumerable<TSource> FilterByUniqueProp2<TSource>
(this IEnumerable<object> query, TSource model)
{
// We use Cast<>() to conver the IEnumerable<>
return query.Cast<TSource>().FilterByUniqueProp<TSource>(model);
}
}
您使用.Cast<>
!
像這樣使用它:
// Your data
IEnumerable<object> addedEntities = new object[] { new MyClass(), new MyClass() };
object model = new MyClass();
// The needed code
Type type = model.GetType();
MethodInfo method = typeof(DynamicLinqExtensions)
.GetMethod("FilterByUniqueProp2")
.MakeGenericMethod(type);
method.Invoke(null, new object[] { addedEntities, model });
請注意,實際上您可以直接將FilterByUniquePropr
的簽名FilterByUniquePropr
為:
public static IEnumerable<TSource> FilterByUniqueProp<TSource>
(this IEnumerable<object> query, TSource model)
{
var query2 = query.Cast<TSource>();
var type = typeof(TSource);
return null;
}
並使用反射來調用此方法!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.