【发布时间】:2015-08-07 21:26:52
【问题描述】:
我在内存中有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在运行时执行它。
在运行时,我必须为一些 runtime-known 类型的Enumerable<T> 动态调用此方法。
但是,不管我做什么,它都不起作用。 model.GetType() 总是 Object 或者抛出异常。
对象类型 'System.Linq.Enumerable+WhereSelectArrayIterator
2[System.Data.Objects.ObjectStateEntry,System.Object]' cannot be converted to type System.Collections.Generic.IEnumerable1[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 });
【问题讨论】:
-
IEnumerable<>中的类型都是单类型还是多类型?所有PersonDetail也是如此,或者他们可以是一个PersonDetail加 一个DogDetail? -
@xanatos 所有单一类型。
-
等等...你有
model对象,所以你可以检查它的类型,对吧? -
@xanatos 是的,对。我知道我必须创建什么类型的通用列表。
-
@farhas 你甚至不需要创建
List<>。查看答案。
标签: c# linq dynamic reflection