我有一个看起来像这样的方法:
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
答案中的方法编译和调用它......但我不知道这会产生什么后果。