如何“编译”NewExpression
来实例化指向的new
表达式?
我是否必须手动构造对象,或者我可以将构造的对象作为参数?
很快就会以一个例子来更新我的问题。
class Obj
{
public async Task ParseAsync<TObj>(Expression<Func<TObj, Task>> pointedMethod)
{
var method = pointedMethod.Body as MethodCallExpression;
var arg = method.Arguments[0];
var newExp = arg as NewExpression;
//This is what I need:
User = newExp.ConstructObject();
await Task.FromResult((object)null);
}
public async Task MyMethod(User user)
{
await Task.FromResult((object)null);
}
}
static void Main(string[] args)
{
var obj = new Obj();
obj.ParseAsync<Obj>(o => o.MyMethod(new User())).Wait();
}
注意:
在执行时,没有对TObj
的正确引用,该项必须仅由提供给ParseAsync
函数的参数构成。
由于我有NewExpression
,这意味着对象(我的示例中为User
)能够构建。
问题是,是否有一种实例化对象的方法,而无需手动查找构造函数并调用它等。
答案 0 :(得分:2)
答案最初由@ dasblinkenlight回答,我不知道他为什么删除它,它只是起作用。无论如何,他应该选择取消删除他的答案,我会删除我的并归功于他!
无论如何参考:
答案取决于NewExpression是否有问题 引用任何参数,如果您有权访问这些参数 表达式,如果它。
如果NewExpression没有参数,只需构造一个lambda 表达式,编译和运行:
NewExpression myNewExpression = ... // You have this var instantiator = (Func<MyResultType>)Expression .Lambda<Func<MyResultType>>(myNewExpression) .Compile(); MyResultType res = instantiator();