2013-07-25 18 views
6

voglio CONCAT due espressioni per l'espressione finaleLINQ Expression Conversione/Concat da Int a stringa

Expression<Func<T, string>> 

Così ho creato espressione belwo codice funziona bene solo per i tipi di stringa, Se ottengo memberExpression come Int32 o DateTime gettando eccezione

Espressione di tipo 'System.Int32' non può essere utilizzato per il parametro di tipo 'System.String' del metodo 'System.String Concat (System.String, System.String)'

Se convertire l'espressione come

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

get Nessun operatore di coercizione è definito tra i tipi "System.Int32" e "System.String".

Si prega di aiutarmi a risolvere

Codice

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

Perché non modificare la firma del metodo per prendere un 'oggetto' e chiamare semplicemente .ToString() su tutto. –

+0

Expression > –

+0

Ciao, sto usando questa espressione in GroupBy, quindi ne ho bisogno nel formato sopra –

risposta

6

Invece di cercare di gettare a stringa, si potrebbe provare a lanciare quindi di opporsi chiamando ToString(), come se si stesse facendo:

var converted = member.ToString(); 

come espressione, sarà simile a questa:

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

Invece di chiamare string.Concat(string, string), si potrebbe provare a chiamare string.Concat(object, object):

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

bene mentre sto usando questa espressione in LINQ Group By, dando concat non funziona con tipi oggetto, oggetto –

0

Per espandere sulla risposta di Richard Ritenendo anche se è un po 'tardi.

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

Questo dovrebbe funzionare bene pur consentendo alla firma di rimanere come si ha.