2017-02-02 10 views
0

動的linq式で2つの文字列を連結しようとしています。関数に渡すパラメータは二項でなければなりません。問題は、Expression.Addが文字列を追加する方法がわからないためにエラーがスローされることです。2つの文字列を連結することができるC式#

x => (string)x["FirstName"] + " Something here..." 

私が持っているもの:事前に

var pe = Expression.Parameter(typeof(Dictionary<string, object>), "x"); 
var firstName = Expression.Call(pe, typeof(Dictionary<string, object>).GetMethod("get_Item"), Expression.Constant("FirstName")); 
var prop = Expression.Convert(firstName, typeof(string)); 
var exp = Expression.Add(prop, Expression.Constant(" Something here...")) 

おかげで私はachiveしようとしている何

+0

Dictionary にはFirstNameが文字列として含まれていますか? {Key: "FirstName"、Value: "Andoni"}? – Vijay

答えて

2

は、(それが数値プリミティブの場合と同様に)表現が明示的に扱うタイプのどちらもあるもstringので、原因+の過負荷(に仕事に行きますあなたが明示的にオーバーロードしたときに呼び出されるべきメソッドが定義されてする必要があるので、)そのような過負荷を持っていない:

Expression.Add(
    prop, 
    Expression.Constant(" Something here...") 
    typeof(string).GetMethod("Concat", new []{typeof(string), typeof(string)})) 

これは、2つの文字列引数を使用する方法をとるstring.Concatの過負荷になります。

Expresssion.Callを使用することもできますが、これにより、+の意図が明示的に保持されます(その理由で、式を生成するときにC#コンパイラが行うことです)。

0

追加と連結は全く異なるプロセスです。 2つの文字列を一緒に「追加」すると、文字列に数学的な加算を行うことは意味をなさないので、それらを連結します。

文字列を連結する最も良い方法は、String.Concatを使用することです。あなたは、メソッド式を生成するためにExpression.Callを使用することができます:文字列を追加する

// Create the parameter expressions 
var strA = Expression.Parameter(typeof(string)); 
var strB = Expression.Parameter(typeof(string)); 

// Create a method expression for String.Join 
var methodInfo = typeof(string).GetMethod("Concat", new[] { typeof(string), typeof(string) }); 
var join = Expression.Call(methodInfo, strA, strB); 
+0

@Robフェアポイントが編集されます。 – Abion47

+0

'String.Join'は文字列の連結とは異なります。 'String.Join(a、b)'は 'b'を返します。 – Rob

+0

@Rob 'String.Join'の代わりに' String.Concat'を使うコードを考えていますが、 'Join'と' Concat'が違うわけではないと感じています。 'Join'は、指定された区切り文字で区切られた文字列の配列を連結します。空の文字列にすることができます。 'String.Join(" "、" a "、" b ")'は '' ab "'を返します。 – Abion47

関連する問題