を使用してオブジェクトを作成しはじめ動的反射、チェーン方法やラムダ式
私のアプリケーションは、メソッドチェーンを使用してオブジェクトをインスタンス化します。
var car = new Car("Ferrari").Doors(2).OtherProperties(x = x.Color("Red"));
問題
私には要件があります実行時にこのオブジェクトを動的に生成する - 構成に必要な連鎖されたメソッドは実行時に決定されるため、すべてを動的に組み立てる必要があります。私は過去に反射を使ってnew Car("Ferrari", 2, "Red")
のような単純なオブジェクトを作成しました - それで涼しいですが、ラムダ式をパラメータとして持つ連鎖メソッドのものは絶対にありません。私は表現木を見て、これが動的表現パラメータを作成するソリューションの一部だと考えていますが、基本オブジェクトと追加の連鎖メソッドを作成するためにリフレクションと一緒にステッチする方法を理解しようとしています。
おかげで、私の問題で、あなたが提供することができるかもしれない任意の指導や情報を探すために時間を割いて、事前に感謝
。
UPDATE:結論その答えのためのdasblinkenlightとジョンスキートに
感謝を。彼のコードサンプルがすぐに私を離れてすぐ走ったので、私はdasblinkenlightの答えを選びました。メソッド連鎖については、私は基本的に受け入れられた答えで同じループの手法を使用したので、私はそのコードを繰り返しませんが、以下では、表現ツリーメソッドの呼び出しをリフレクションによって実行できるアクションデリゲートに動的に変換するコードを示します。Invoke()
dasblinkenlightの答えで。これは、ジョンが指摘したように、本当に問題の要点でした。
メソッドメタデータを格納するヘルパークラス。
public struct Argument
{
public string TypeName;
public object Value;
}
public class ExpressionTreeMethodCall
{
public string MethodName { get; set; }
public IList<Argument> Arguments { get; set; }
public ExpressionTreeMethodCall()
{
Arguments = new List<Argument>();
}
}
staticメソッドラムダ式のメソッド呼び出しを組み立てた後、(私の場合はInvoke()
への引数として渡された)他の場所で実行するアクションデリゲートとしてそれを返します。
public static Action<T> ConvertExpressionTreeMethodToDelegate<T>(ExpressionTreeMethodCall methodData)
{
ParameterExpression type = Expression.Parameter(typeof(T));
var arguments = new List<ConstantExpression>();
var argumentTypes = new List<Type>();
foreach (var a in methodData.Arguments)
{
arguments.Add(Expression.Constant(a.Value));
argumentTypes.Add(Type.GetType(a.TypeName));
}
// Creating an expression for the method call and specifying its parameter.
MethodCallExpression methodCall = Expression.Call(type, typeof(T).GetMethod(methodData.MethodName, argumentTypes.ToArray()), arguments);
return Expression.Lambda<Action<T>>(methodCall, new[] { type }).Compile();
}
感謝ダスは...そう、あなたの提供されたコードが使用して:
x.Color("Red")
の呼び出しは次のようになりますチェーンループ? – mmacneil007@ mmacneil007絶対に、それは考えです。 'Action'は、配列の 'chainedArgs'配列内の配列の1つに格納され、対応するメソッド(あなたの場合は' OtherProperties')に渡すことができるデリゲートです。 –
dasblinkenlight
優秀、私はこれが正しい道に私を置いたと信じています。まだ表現の木の周りに私の頭を包んでいるが、私はあなたがここで概説したアプローチはトリックを行うべきだと思う。再度、感謝します! – mmacneil007