2017-02-18 11 views
0

NewExpressionを「コンパイル」して、尖ったnewの式をインスタンス化できますか?Linq.Expressions.NewExpressionを解決しますか?

オブジェクトを手動で構築する必要がありますか、または構築されたオブジェクトを引数として取得できますか?

まもなく私の質問を更新するつもりです。

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(); 
} 

注: 実行時に、アイテムがParseAsync関数に渡された引数のみから構成される必要があり、TObjへの適切な参照ができなくなります。
私はNewExpressionを持っているので、オブジェクト(私の例ではUser)が構築できることを意味します。手動で歩いコンストラクタを見つけ、など

答えて

0

回答はもともと@dasblinkenlightで答えたそれを呼び出すことなく、オブジェクトをインスタンス化する方法がある場合
質問があり、私は彼がそれを削除した理由は何の手がかりは、それだけで働いていません。とにかく、彼は彼の答えを元に戻すことを選ぶべきですか私は私のことを削除し、彼を信用します!参照のためにとにかく

答えは質問 でNewExpressionは、任意のパラメータを参照し、あなたはケースでこれらのパラメータへのアクセス 表情を持っている場合はそれがないかどうかによって異なります。

NewExpressionにパラメータがない場合は、単に、それからラムダ 式を構築し、コンパイルし、実行します。

NewExpression myNewExpression = ... // You have this 
var instantiator = (Func<MyResultType>)Expression 
    .Lambda<Func<MyResultType>>(myNewExpression) 
    .Compile(); 
MyResultType res = instantiator(); 
関連する問題