2
IronPythonでそれらを使用するために、Expression
とそれらの式ツリーについて学習しています(ただしこれは現在のところ無関係です)。2つのオブジェクトを文字列連結するための式ツリーの作成
私は何をしようとしていることは、次のラムダのような式ツリーを作成し、次のとおりです。String.Concat
のExpression.Call
が動作しません
public static Expression<Func<T, int, string>> StringConcatSelector<T>()
{
var parameterParam = Expression.Parameter(typeof(T), "x");
var paramToString = typeof(T).GetMethods().FirstOrDefault(s=>s.Name=="ToString");
var parameter = Expression.Call(parameterParam, paramToString);
var intParameterParam = Expression.Parameter(typeof(int), "s");
var intParameterToString = typeof(int).GetMethods().FirstOrDefault(s => s.Name == "ToString");
var intParameter = Expression.Call(intParameterParam, intParameterToString);
var stringConcat = typeof(string).GetMethods().FirstOrDefault(s => s.Name == "Concat");
var result = Expression.Call(stringConcat, parameter, intParameter);
return Expression.Lambda<Func<T, int, string>>
(result, parameterParam, intParameterParam);
}
:
Func<T, int, string> func = (s,t) => s + t;
が私の現在の機能はこれですこれは無効なパラメータ数のためです。 だから、私はのようなものが必要だと思う:リスト
String.Concat
に両方の値を追加List<string>
-variable-式を作成
- 。
私は正しいですか?
の場合は、リスト変数(または配列)を作成し、両方の値を追加してString.Concat
のパラメータとして使用するにはどうすればよいですか?
ああ。はい。私はこれに対して頭がない。大丈夫、それは完全に動作します:) –
また、 'new [] {typeof(object)、typeof(object)}'を使用して2つの 'object'引数をとるオーバーロードを呼び出すことができ、' ToString() '。インタプリタ式のコンパイラでは、インタプリタの手順が少なくて済むので、やや効率的です。 ILをコンパイルすると、効率的ではないでしょう( 'int.ToString()'は直接呼び出されたときにボックスに入れる必要はありませんが、ボックスになります)。 –
@JonHannaあなたのヒントのおかげで、今は例外が発生しています。 Object型のパラメータとしてInt32型のオブジェクトを使用することはできません。 –