7

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);
ineffable p
  • 1,207
  • 2
  • 22
  • 46

4 Answers4

10

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"));
Jon G
  • 4,083
  • 22
  • 27
1

It can be further simplified to:

var convertedExpression = Expression.Call(
                     memberExpression,
                     typeof(object).GetMethod("ToString"));
SCouto
  • 7,808
  • 5
  • 32
  • 49
SmartCoder
  • 856
  • 6
  • 11
0

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) });
Richard Deeming
  • 29,830
  • 10
  • 79
  • 151
0

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.

SilverX
  • 1,509
  • 16
  • 18