私は以下のような一般的なクラスがあります。私の場合はジェネリック型とインスタンスの値だけを持つときに式ツリーを手動で構築する方法はありますか?
public class MyClass<T, TProperty>
{
MyClass(Expression<Func<T, TProperty>> expression)
{
}
}
は、私が動的にアクティベーターを使用して、そのクラスのインスタンスを作成します。だから私が必要なのは、コンストラクタの式を作成することです。私が持っていることのタイプ(のSystem.Type)とオブジェクト(のSystem.Object)があり、私は以下のような何かをしたい:オブジェクトとして宣言されている
Expression<Func<T, TProperty>> exp = x => someValue;
「someValueの」が、それは本当のタイプは間違いなくTPropertyあるのです。それは反射によって解決されるので、ここのタイプはオブジェクトです。
問題は、タイプTとTPropertyが汎用であるため、実行時まで型がわからないため、TPropertyに「someValue」をキャストできません。私たちはtypeof(T)、typeof(TProperty)とオブジェクトを持っています。
あなたが呼び出したいものを、コンストラクタやプロパティコードは明らかではありません。これが普通のC#(表現ではない)だった場合、結果はどうなるでしょうか? –
Marcに感謝します。コンストラクタが式を必要とするので、MyClass型のオブジェクトをインスタンス化する必要があるので、記述したように式を動的に作成します。 –
私はいつも使っているトリックです。小さなライブラリを作成し、タイプセーフなバージョンを作成し、コンパイルして、Reflectorで.dllを開きます。ビュー/オプション/最適化で ".NET 2.0"を選択すると、C#コンパイラがあなたのために生成した 'Expression'オブジェクトが表示されます。 – Steven