2013-07-25 10 views
6

Chcę Concat dwa wyrażenia dla ostatecznego wyrazuLINQ Expression Conversion/Concat z Int ciąg

Expression<Func<T, string>> 

Więc stworzyliśmy wyrażenie belwo kod działa poprawnie tylko dla typów łańcuchowych, Jeśli dostanę memberExpression jako Int32 lub DateTime wyrzucanie wyjątkiem

Ekspresja typu 'System.Int32' nie może być stosowany do parametru typu 'system.string' metody 'system.string concat (system.string, system.string)'

Jeśli przekonwertuj wyrażenie jako

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

pobieranie Brak operatora przymusu między typami "System.Int32" i "System.String".

Proszę mi pomóc rozwiązać

Kod

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

Dlaczego nie zmienić sygnatury metody, aby wziąć "obiekt" i po prostu wywołać .ToString() na wszystko. –

+0

Wyrażenie > –

+0

Witam, używam tego wyrażenia w GroupBy, więc potrzebuję go w powyższym formacie –

Odpowiedz

6

Zamiast próbować rzucać do łańcucha, można spróbować odlewania sprzeciwić następnie wywołanie toString(), jakby robisz:

var converted = member.ToString(); 

jako wyraz, będzie to wyglądać mniej więcej tak:

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

Zamiast nazywając string.Concat(string, string), można spróbować nazywając string.Concat(object, object):

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

dobrze, podczas gdy używam tego wyrażenia w LINQ Group By, dając concat nie działa z obiektami typu, obiektem –

0

Aby rozwinąć na odpowiedź Richarda uznania, nawet jeśli jest to trochę późno.

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

Powinno to zadziałać dobrze, pozwalając na pozostanie podpisu tak, jak go masz.