Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 追加表达式以创建不同类型的表达式_C#_Expression - Fatal编程技术网

C# 追加表达式以创建不同类型的表达式

C# 追加表达式以创建不同类型的表达式,c#,expression,C#,Expression,我有一个方法,它接收一个表达式,我想通过调用对象上的方法来扩展它。扩展表达式的结果将始终是bool。基本上,我想将表达式转换为表达式 以下是我想做的要点。我意识到这并不是因为ReportExpr是Expression类型,而不是MethodCallExpression而编译的,但我认为这传达了以下意图: private MyObjectData CreateMyObjectData(string description, FieldTypes fieldType, Expression

我有一个方法,它接收一个
表达式
,我想通过调用
对象
上的方法来扩展它。扩展表达式的结果将始终是
bool
。基本上,我想将
表达式
转换为
表达式

以下是我想做的要点。我意识到这并不是因为
ReportExpr
Expression
类型,而不是
MethodCallExpression
而编译的,但我认为这传达了以下意图:

private MyObjectData CreateMyObjectData(string description, 
    FieldTypes fieldType, Expression<Func<MyObject, object>> expression)
{
    var data= new MyObjectData()
    {
        ReportDesc = description,
        FieldType = fieldType,
    };

    var method = typeof(DateTime?).GetMethod("Between");
    Expression<Func<MyObject, DateTime?>> from = x => x.FromValue as DateTime?;
    Expression<Func<MyObject, DateTime?>> to = x => x.ToValue as DateTime?;
    var methodCallExpression = Expression.Call(expression, method, from, to);
    data.ReportExpr = methodCallExpression;
    return data;
}
私有MyObjectData CreateMObjectData(字符串描述,
字段类型(字段类型,表达式)
{
var data=新的MyObjectData()
{
ReportDesc=说明,
FieldType=FieldType,
};
var方法=类型(日期时间?).GetMethod(“介于之间”);
表达式from=x=>x.FromValue作为日期时间?;
表达式to=x=>x.ToValue作为日期时间?;
var methodCallExpression=Expression.Call(表达式、方法、从、到);
data.ReportExpr=methodCallExpression;
返回数据;
}

所以你想从
(客户c)=>c.SomeDateTime
转到
(客户c)=>介于(c.SomeDateTime,a,b)
之间。查看调试器中的示例表达式,并查看它们的结构

表达式不包含常量。它包含一个参数
c
。我们可以重用参数:

var cParam = expression.Parameters[0];
接下来我们分离出
c.SomeDateTime

var memberAccess = expression.Body;
接下来,我们构建新的主体:

Expression.Call(
    "Between",
    memberAccess,
    Expression.Constant(DateTime.Now),
    Expression.Constant(DateTime.Now));
接下来是新的lambda:

var lambda = Expression.Lambda<Func<Customer, bool>>(cParam, body);
var lambda=Expression.lambda(cParam,body);

即使我忘了什么,你现在也能弄明白。

那么你只想执行
表达式
,然后返回一个包含返回值的表达式?我对表达式有点陌生,但是在这一点上执行它会不会将
FromValue
ToValue
的当前值锁定到调用
ReportExpr
时不会对其进行计算的位置?如果您只想将计算延迟到将来的某一点,那么您实际上不需要表达式。您可以简单地分配一个委托,然后在将来的某个时候调用它(它们比表达式更容易使用)。这就是你要找的吗?否则,您将无法使用
Expression.Lambda()
来构造表达式,而此方法似乎根本无法检查表达式的值。请告诉我们您希望实现的更多信息。这将解决什么情况?我希望改用委托,因为我对委托更熟悉,但不幸的是,这被用于在更高级别上动态构造查询,所以我认为在这种情况下,我只能使用表达式。