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