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);
3
  • Why not change your method signature to take an 'object' and just call .ToString() on everything. Commented Jul 25, 2013 at 15:33
  • Expression<Func<T, T2>> Commented Jul 25, 2013 at 15:36
  • Hi , I am using this expression in GroupBy , so I need it in above format Commented Jul 26, 2013 at 4:58

4 Answers 4

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"));
Sign up to request clarification or add additional context in comments.

Comments

2

It can be further simplified to:

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

Comments

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

1 Comment

well while I am using this expression in LINQ Group By , giving concat not work with types object , object
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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.