3

我正在做一个项目,我遇到的情况是我需要从可查询的对象中“选择”数据。不幸的是,在编译时我不知道实际的可查询对象是什么类型。所以我试图通过反射调用“选择”方法。到目前为止我尝试过的代码如下。

....
.......
//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** });
....
...

谁能告诉我如何Func<TSource, TResult>为 selectMethod 制作一个“”以通过反射调用“Select”方法?谢谢。




更新: 正如@Jon Skeet 提到的。示例代码中有几个错误。显然,我可能会以错误的方式问这个问题(绝对是我的错)。所以我决定修改原始问题以使其更清楚(或更糟)。希望有帮助。

4

1 回答 1

1

(这个答案曾经只是一个评论。)

会是这样的

Type funcType = typeof(Func<,>).MakeGenericType(argumentType, argumentType);

(在实际情况下,您可能不希望TSourceTResult相同。)

之后,Delegate.CreateDelegate使用您funcType想要放入新委托的任何“选择功能”进行调用。

于 2012-05-21T15:15:28.897 回答