2017-01-19 11 views
2

IronPythonでそれらを使用するために、Expressionとそれらの式ツリーについて学習しています(ただしこれは現在のところ無関係です)。2つのオブジェクトを文字列連結するための式ツリーの作成

私は何をしようとしていることは、次のラムダのような式ツリーを作成し、次のとおりです。String.ConcatExpression.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のパラメータとして使用するにはどうすればよいですか?

  • 答えて

    4

    String.Concatメソッドにはオーバーロードが11個あり、ランダムなものがあります。

    お使いの場合に最も適したあなたはtypes配列は、メソッドの引数の型を表し、次のType.GetMethod過負荷

    public MethodInfo GetMethod(string name, Type[] types) 
    

    を使用することによって得ることができた

    public static String Concat(String str0, String str1) 
    

    です

    var stringConcat = typeof(string).GetMethod("Concat", 
        new[] { typeof(string), typeof(string) }); 
    
    +1

    ああ。はい。私はこれに対して頭がない。大丈夫、それは完全に動作します:) –

    +1

    また、 'new [] {typeof(object)、typeof(object)}'を使用して2つの 'object'引数をとるオーバーロードを呼び出すことができ、' ToString() '。インタプリタ式のコンパイラでは、インタプリタの手順が少なくて済むので、やや効率的です。 ILをコンパイルすると、効率的ではないでしょう( 'int.ToString()'は直接呼び出されたときにボックスに入れる必要はありませんが、ボックスになります)。 –

    +0

    @JonHannaあなたのヒントのおかげで、今は例外が発生しています。 Object型のパラメータとしてInt32型のオブジェクトを使用することはできません。 –

    関連する問題