2

次のようなメソッドがあります。

public static T GenerateProxy<T>(params object[] ctorArgs)
{
    return proxyGenerator.CreateProxy(typeof(T), ctorArgs);
}

基本的に、型 T と、一致するコンストラクターを見つけるために提供する引数に基づいて、適切なコンストラクターを呼び出しています。これは機能しますが、コンストラクターが変更された場合、コンストラクターが変更する引数の数を変更しても、コンパイル時エラーは発生しません。Expression次のように、を使用してコンストラクターの引数を取得する便利なユーティリティ メソッドを見つけました。

public static object[] GetCTorArgumentsFromSelector<T>(Expression<Func<T>> ctorCall) where T : class
{
    if (ctorCall == null) throw new ArgumentNullException("ctorCall");

    var newCall = ctorCall.Body as NewExpression;
    if (newCall == null)
    {
        throw new ArgumentException("Not a constructor call.", "ctorCall");
    }

    int argumentCount = newCall.Arguments.Count;

    var ctorArgs = new object[argumentCount];
    for (int i = 0; i < ctorArgs.Length; i++)
    {
        var param = newCall.Arguments[i] as ConstantExpression;
        if (param == null)
            throw new ArgumentException("You may only place constant values in calls to the constructor.");

        ctorArgs[i] = param.Value;
    }

    return ctorArgs;
}

したがって、次のように使用できます。

SomeClass arg = new SomeClass();
var ctorArgs = GetCTorArgumentsFromSelector(() => MyClass(arg));
var proxy = GenerateProxy<MyClass>(ctorArgs);

...これは素晴らしく、強く型付けされます。だから...私は式についてよく知らないので、定数のみを使用するという制限を何らかの方法で回避できるかどうか疑問に思っています。上記の例argは定数ではないため機能しませんが、このように使用すると便利です。

制限が存在する理由を理解していると思いますが、他の誰かがここで別の方法について良い考えを持っていることを望んでいました. 前もって感謝します。

編集-さらに検索した後、 に置き換えConstantExpressionて、ここMemberExpressionでの回答にあるメソッドを使用してコンパイルして呼び出すことができるようです...しかし、これがどのような影響を与えるかわかりません。

4

0 に答える 0