7

我想为最终表达式连接两个表达式

Expression<Func<T, string>>

所以我创建了表达式 belwo 代码仅适用于字符串类型,如果我将 memberExpression 作为 Int32 或 DateTime 抛出异常

“System.Int32”类型的表达式不能用于“System.String Concat(System.String, System.String)”方法的“System.String”类型参数

如果我将表达式转换为

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

在“System.Int32”和“System.String”类型之间没有定义强制运算符。

请帮我解决

代码

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

4 回答 4

10

您可以尝试转换为对象,然后调用 ToString(),而不是尝试转换为字符串,就好像您正在执行以下操作一样:

var converted = member.ToString();

作为一个表达式,它看起来像这样:

var convertedExpression = Expression.Call(
                     Expression.Convert(memberExpression, typeof(object)),
                     typeof(object).GetMethod("ToString"));
于 2013-07-25T15:54:34.353 回答
1

可以进一步简化为:

var convertedExpression = Expression.Call(
                     memberExpression,
                     typeof(object).GetMethod("ToString"));
于 2019-06-10T05:59:53.243 回答
0

而不是打电话string.Concat(string, string),你可以尝试打电话string.Concat(object, object)

MethodInfo bodyContactMethod = typeof (string).GetMethod("Concat", 
   new[] { typeof(object), typeof(object) });
于 2013-07-25T15:57:16.083 回答
0

扩展 Richard Deeming 的答案,即使它有点晚了。

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

这应该可以正常工作,同时允许签名保持原样。

于 2014-11-16T09:35:51.480 回答