解决Linq.Expressions.NewExpression?

时间:2017-02-18 23:04:47

标签: c# linq linq-expressions

如何“编译”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)能够构建。
问题是,是否有一种实例化对象的方法,而无需手动查找构造函数并调用它等。

1 个答案:

答案 0 :(得分:2)

答案最初由@ dasblinkenlight回答,我不知道他为什么删除它,它只是起作用。无论如何,他应该选择取消删除他的答案,我会删除我的并归功于他!

无论如何参考:

  

答案取决于NewExpression是否有问题   引用任何参数,如果您有权访问这些参数   表达式,如果它。

     

如果NewExpression没有参数,只需构造一个lambda   表达式,编译和运行:

NewExpression myNewExpression = ... // You have this
var instantiator = (Func<MyResultType>)Expression
    .Lambda<Func<MyResultType>>(myNewExpression)
    .Compile();
MyResultType res = instantiator();