3

私はプロジェクトに取り組んでいますが、遭遇した状況は、クエリ可能なオブジェクトからデータを「選択」する必要があるということです。残念ながら、コンパイル時に実際のクエリ可能なオブジェクトがどのタイプであるかを知ることはできません。そのため、リフレクションを介して「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** });
....
...

Func<TSource, TResult>selectMethodがリフレクションを介して"Select"メソッドを呼び出すための""を作成する方法を教えてもらえますか?ありがとう。




更新: @JonSkeetが述べたように。サンプルコードにはいくつかの間違いがあります。どうやら、私は間違った方法で質問をするかもしれません(間違いなくそれはすべて私のせいです)。そのため、元の質問をより明確に(またはより悪く)するように変更することにしました。お役に立てば幸いです。

4

1 に答える 1

1

(この回答はかつては単なるコメントでした。)

それは次のようなものになります

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

(実際の状況では、おそらく同じであることを望んTSourceでいませんTResult。)

その後、新しいデリゲートに入れたい「選択関数」をDelegate.CreateDelegate使用して呼び出します。funcType

于 2012-05-21T15:15:28.897 に答える