1. ホーム
  2. c#

[解決済み] Linq.Expressions.NewExpressionを解決しますか?

2022-02-24 11:23:30

質問

を「コンパイル」するにはどうすればよいのでしょうか? 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 は構築することが可能です。
問題は、手作業でコンストラクタを見つけて呼び出すなどせずに、オブジェクトをインスタンス化する方法があるかどうかということです。

どのように解決するのですか?

回答は元々@によって回答されました。 ダスブリンクライト なぜ彼がそれを削除したのか、私にはわからない。とにかく、彼が自分の回答を削除することを選択した場合、私は私の回答を削除し、彼の功績を称えたいと思います

とにかく参考にしてください。

<ブロッククオート

答えは、問題の NewExpression があるかどうかで決まります。 はパラメータを参照し、そのパラメータにアクセスできるかどうか。 の式がある場合に備えています。

NewExpression にパラメータがない場合、単純にラムダ を作成し、コンパイルして実行します。

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