是否可以通过反射调用“选择”方法

时间:2012-05-20 19:44:06

标签: c# linq reflection

我正在研究一个项目,我遇到的情况是我需要从可查询对象中“选择”数据。不幸的是,我无法知道实际可查询对象在编译时的类型。所以我尝试通过反射调用“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所说。示例代码中有几个错误。显然,我可能会以错误的方式提出问题(这绝对是我的错)。因此我决定修改原始问题以使其更清楚(或更糟)。希望有所帮助。

1 个答案:

答案 0 :(得分:1)

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

这就像是

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

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

然后,使用您的funcType和您想要添加到新代表中的“选择功能”来呼叫Delegate.CreateDelegate