我正在研究一个项目,我遇到的情况是我需要从可查询对象中“选择”数据。不幸的是,我无法知道实际可查询对象在编译时的类型。所以我尝试通过反射调用“select”方法。我到目前为止尝试的代码如下。
....
.......
//suppose that I've got TSource and TResult at runtime.
Type argumentType = Model.GetArgumentType();
//get a queryable object from modle.
IEnumerable obj = Model.GetQueryableObject();
//looking for Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector);
var selectMethod = typeof(System.Linq.Enumerable)
.GetMethods(BindingFlags.Static | BindingFlags.Public)
.Where(mi => mi.Name == "Select" &&
mi.GetParameters()[1].ParameterType.GetGenericArguments().Count() == 2)
.Single()
.MakeGenericMethod(new Type[] { argumentType, argumentType });
//that is where I have no idea how to do it
var result = selectMethod.Invoke(null, new object[] { obj, **xxxxxx** });
....
...
任何人都可以告诉我如何通过反射调用“选择”方法为selectMethod制作一个“Func<TSource, TResult>
”?感谢。
的更新
正如@Jon Skeet所说。示例代码中有几个错误。显然,我可能会以错误的方式提出问题(这绝对是我的错)。因此我决定修改原始问题以使其更清楚(或更糟)。希望有所帮助。
答案 0 :(得分:1)
(这个回答曾经只是一个评论。)
这就像是
Type funcType = typeof(Func<,>).MakeGenericType(argumentType, argumentType);
(在实际情况中,您可能不希望TSource
和TResult
相同。)
然后,使用您的funcType
和您想要添加到新代表中的“选择功能”来呼叫Delegate.CreateDelegate
。