8

Linq.Expression ツリーで String.Format を呼び出そうとしています。簡単な例を次に示します。

    var format = Expression.Constant("({0}) {1}");
    var company = Expression.Property(input, membernames.First());
    var project = Expression.Property(input, membernames.Last());
    var args = new Expression[] {format, company, project};
    var invoke = Expression.Call(method,args);

ただし、問題は String.Format に次の署名があることです。

String.Format(string format, params object[] args)

Expression[] を渡そうとしています。

これで、配列を作成し、式の結果を入力するというすべての問題を解決できましたが、実際に結果を望んでいるのは次のようなものです。

String.Format("({0}) {1}", input.foo, input.bar)

Linq 式を介して params 関数を呼び出すにはどうすればよいですか?

4

2 に答える 2

11

params実際に行うことは、そのパラメーターを指定することだけですParamArrayAttribute。C# コンパイラはこれを理解し、バックグラウンドで配列を作成します。

式はこれを理解していないため、 でメソッドを呼び出したい場合は、実際には自分で配列を作成する必要がありますparamsparamsこれは、式に -method を使用してラムダを代入すると、式に配列の作成が含まれるという事実からもわかります。

Expression<Func<string>> expression = () => string.Format("",1,2,3,4);
string expressionString = expression.ToString();

ここには、次のexpressionString文字列が含まれます。

() => Format("", new [] {Convert(1), Convert(2), Convert(3), Convert(4)})

配列を作成する式を作成するには、Expression.NewArrayInit()メソッドを使用します。

そうは言っても、2 つのパラメーター (または 1 つまたは 3 つ) のみが必要な場合は、式から直接使用できるオーバーロードがあります。string.Format()

于 2011-05-24T22:18:38.897 に答える
0

params単なる構文糖衣です。最終的に、パラメーターは単なる配列です。したがって、パラメーターの型は である必要がobject[]あり、そのような配列を記述する式を 2 番目の引数として渡す必要があります。つまり、引数は 3 つではなく2だけにする必要があります。2 番目の引数は、現在の 2 番目と 3 番目の引数を含む 2 要素の配列である必要があります。

于 2011-05-24T22:08:07.243 に答える