2013-07-25 7 views
6

ich zwei Ausdrücke für den endgültigen Ausdruck Concat wollenLINQ Expression Konvertierung/Concat von Int String

Expression<Func<T, string>> 

So habe ich erstellt Ausdruck Belwo Code gut für nur String-Typen funktioniert, wenn ich Member als Int32 erhalten oder Datetime werfen Ausnahme

Expression des Typs 'System.Int32' kann nicht für Parameter vom Typ 'System.String' der Methode 'System.String Concat (System.String, System.String)'

verwendet werden, wenn ich Konvertieren Sie den Ausdruck als

var conversion = Expression.Convert(memberExpression, typeof (string)); 

getting Zwischen den Typen 'System.Int32' und 'System.String' ist kein Zwangsoperator definiert.

Bitte helfen Sie mir

-Code

MethodInfo bodyContactMethod = typeof (string).GetMethod("Concat",new[] {typeof (string), typeof (string)}); 

ParameterExpression parameter = Expression.Parameter(typeof (T)); 

body = Expression.Call(bodyContactMethod, cons, memberExpression); 

return Expression.Lambda<Func<T, string>>(body, parameter); 
+0

Warum ändern Sie nicht Ihre Methodensignatur, um ein "Objekt" zu nehmen und rufen Sie einfach .ToString() für alles auf. –

+0

Ausdruck > –

+0

Hallo, ich benutze diesen Ausdruck in GroupBy, also brauche ich es in obigem Format –

Antwort

6

Anstatt zu versuchen, zu bespannen zu werfen, Sie könnten versuchen, Gießen dann auf Objekt Aufruf ToString(), als ob Sie tun zu beheben:

var converted = member.ToString(); 

als Ausdruck, wird es in etwa so aussehen:

Vielmehr
var convertedExpression = Expression.Call(
        Expression.Convert(memberExpression, typeof(object)), 
        typeof(object).GetMethod("ToString")); 
0

als string.Concat(string, string) Aufruf, könnten Sie versuchen string.Concat(object, object) Aufruf:

MethodInfo bodyContactMethod = typeof (string).GetMethod("Concat", 
    new[] { typeof(object), typeof(object) }); 
+0

gut, während ich diesen Ausdruck in LINQ Group By verwende, concat nicht mit Typen Objekt, Objekt arbeiten –

0

auf Richard Deeming Antwort zu erweitern, obwohl es ein wenig spät ist.

Expression.Call(
    typeof(string).GetMethod("Concat", new[] { typeof(object), typeof(object) }), 
    Expression.Convert(cons, typeof(object)), 
    Expression.Convert(memberExpression, typeof(object)) 
); 

Das gut funktionieren sollte, während die Signatur ermöglicht, wie Sie es haben zu bleiben.