2013-07-25 17 views
6

Tôi muốn CONCAT hai biểu cho sự biểu thứcLINQ Chuyển đổi biểu thức/concat từ Int để chuỗi

Expression<Func<T, string>> 

Vì vậy, tôi đã tạo ra biểu belwo đang hoạt động tốt với nhiều loại chuỗi mà thôi, Nếu tôi nhận được memberExpression như Int32 hoặc DateTime ném ngoại lệ

Biểu hiện của loại 'System.Int32' không thể được sử dụng cho thông số của loại 'System.String' của phương pháp 'System.String concat (System.String, System.String)'

Nếu tôi chuyển đổi biểu thức thành

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

nhận Không có toán tử cưỡng bức nào được xác định giữa các loại 'System.Int32' và 'System.String'.

Xin hãy giúp tôi để giải quyết

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

Tại sao không thay đổi chữ ký phương thức của bạn để thực hiện 'đối tượng' và chỉ cần gọi .ToString() trên mọi thứ. –

+0

Expression > –

+0

Xin chào, tôi đang sử dụng biểu thức này trong GroupBy, vì vậy tôi cần ở định dạng trên –

Trả lời

6

Thay vì cố gắng đúc để chuỗi, bạn có thể cố gắng đúc để phản đối sau đó gọi ToString(), như thể bạn đang thực hiện:

var converted = member.ToString(); 

Như một biểu thức, nó sẽ trông giống như sau:

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

Thay vì gọi string.Concat(string, string), bạn có thể thử gọi string.Concat(object, object):

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

trong khi tôi đang sử dụng biểu thức này trong LINQ Group By, cho concat không hoạt động với các đối tượng, đối tượng –

0

Để mở rộng về câu trả lời Richard xét của mặc dù đó là một chút muộn.

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

Điều đó sẽ hoạt động tốt khi cho phép chữ ký ở lại khi bạn có.