如何在System.Linq.Expression C#中初始化Expression.Call对象

时间:2017-10-03 09:34:54

标签: c# linq

我想在if else条件之外初始化Expression Call。因为我必须使用它来生成表达体,因为我有两种不同的类型来自数据库,即int和int?。我的代码如下。 我得到错误来实例化toString对象。

 var parameterExp = Expression.Parameter(typeof(T), "type");
 var propertyExp = Expression.Property(parameterExp, propertyName);
 MethodInfo method = typeof(string).GetMethod(methodType, new[] { typeof(string) });
 var searchValue = Expression.Constant(propertyValue.ToLower(), typeof(string));

var toString = new MethodCallExpression();

if (propertyName == nameof(CustomerListDto.Id))
{
     toString = Expression.Call(propertyExp, typeof(int).GetMethod("ToString", System.Type.EmptyTypes));
}
else
{
    toString = Expression.Call(propertyExp, typeof(int?).GetMethod("ToString", System.Type.EmptyTypes));
}

var body = Expression.Call(toString, method, searchValue);
return Expression.Lambda<Func<T, bool>>(body, parameterExp);

我不确切知道如何初始化ExpressionCall。这是我想知道的事情。目前它给了我错误&#34; MethodCallExpression不包含带0参数&#34;的构造函数。我搜索了很多但找不到任何解决方案。

1 个答案:

答案 0 :(得分:1)

由于构造函数是私有的,因此无法手动实例化MethodCallExpression。您可以获取MethodCallExpression的实例作为Expression.Call的返回值。您可能只想将其声明为

MethodCallExpression toString;

// Then assign it with Expression.Call(...);

if (propertyName == nameof(CustomerListDto.Id))
{
     toString = Expression.Call(propertyExp, typeof(int).GetMethod("ToString", System.Type.EmptyTypes));
}
else
{
    toString = Expression.Call(propertyExp, typeof(int?).GetMethod("ToString", System.Type.EmptyTypes));
}