2

我有一个看起来像这样的方法:

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

基本上,它根据类型 T 和我提供的任何参数调用适当的构造函数以找到匹配的构造函数。这可行,但是如果构造函数发生更改,如果我更改构造函数更改的参数数量,我不会收到任何编译时错误。我找到了一个很好的实用方法,它使用 anExpression来获取构造函数参数,如下所示:

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