LINQ Expression Conversion / Concat from Int to string

I want to Concat two expressions for the final expression

Expression<Func<T, string>>

So I have created expression belwo code works fine for only string types , If I get memberExpression as Int32 or DateTime throwing exception

Expression of type ‘System.Int32’ cannot be used for parameter of type ‘System.String’ of method ‘System.String Concat(System.String, System.String)’

If I convert the expression as

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

getting No coercion operator is defined between types ‘System.Int32’ and ‘System.String’.

Please help me to resolve

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);

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

Instead of trying to cast to string, you could try casting to object then calling ToString(), as though you were doing:

var converted = member.ToString();

As an Expression, it will look something like this:
var convertedExpression = Expression.Call(
                     Expression.Convert(memberExpression, typeof(object)),
                     typeof(object).GetMethod("ToString"));

Method 2

It can be further simplified to:

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

Method 3

Rather than calling string.Concat(string, string), you could try calling string.Concat(object, object):

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

Method 4

To expand on Richard Deeming’s answer even though it’s a little late.

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

That should work just fine while allowing the signature to stay as you have it.


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x