C# 使用Linq表达式返回默认日期时间
我正试图为一个规则引擎构建一些额外的功能,我正在使用基于本文的表达式树- 我的规则之一是,如果发现某个属性类型是DateTime,则向该属性添加分钟。例如,我可以有“DOB+60”或“DOB-180” 我当前的代码适用于此:C# 使用Linq表达式返回默认日期时间,c#,linq,datetime,expression,C#,Linq,Datetime,Expression,我正试图为一个规则引擎构建一些额外的功能,我正在使用基于本文的表达式树- 我的规则之一是,如果发现某个属性类型是DateTime,则向该属性添加分钟。例如,我可以有“DOB+60”或“DOB-180” 我当前的代码适用于此: var expression = new string[] {"DOB", "+", "60"}; var property = Expression.Property(param, expression[0]); var method = typeof(T).Ge
var expression = new string[] {"DOB", "+", "60"};
var property = Expression.Property(param, expression[0]);
var method = typeof(T).GetProperty(expression[0]).PropertyType.GetMethod("AddMinutes");
/* If we have a AddMinutes method then assume type is of DateTime */
if (method != null)
{
var tParam = method.GetParameters()[0].ParameterType;
/* Calculate if we're adding or subtracting minutes */
var convertedNo = expression[1] == "-" ? int.Parse(expression[2]) * -1 : int.Parse(expression[2]);
var number = Expression.Constant(Convert.ChangeType(convertedNo, tParam));
var exp = Expression.Call(property, method, number);
/* Allows for left property < DOB.AddMinutes(60) */
return Expression.MakeBinary(ExpressionType.LessThan, left, exp);
}
var expression=newstring[]{“DOB”、“+”、“60”};
var property=Expression.property(参数,表达式[0]);
var method=typeof(T).GetProperty(表达式[0]).PropertyType.GetMethod(“AddMinutes”);
/*如果我们有一个AddMinutes方法,那么假设类型是DateTime*/
if(方法!=null)
{
var tParam=method.GetParameters()[0].ParameterType;
/*计算一下我们是加还是减分钟*/
var convertedNo=表达式[1]=“-”?int.Parse(表达式[2])*-1:int.Parse(表达式[2]);
变量编号=表达式常数(Convert.ChangeType(convertedNo,tParam));
var exp=Expression.Call(属性、方法、编号);
/*允许左属性
我遇到的问题是DOB属性可能被设置为DateTime.Min,这样当我的表达式计算“DOB-180”时,就会抛出一个越界异常,因为它试图从DateTime.Min中减去180分钟
我试图通过使用Expression.IfThenElse来解决这个问题,这样,如果DateTime属性等于DateTime.Min,则不进行计算,只对DateTime.Min求值
我的更新代码如下所示:
var expression = new string[] {"DOB", "-", "180"};
var property = Expression.Property(param, expression[0]);
var method = typeof(T).GetProperty(expression[0]).PropertyType.GetMethod("AddMinutes");
/* If we have a AddMinutes method then assume type is of DateTime */
if (method != null)
{
var tParam = method.GetParameters()[0].ParameterType;
/* Calculate if we're adding or subtracting minutes */
var convertedNo = expression[1] == "-" ? int.Parse(expression[2]) * -1 : int.Parse(expression[2]);
var number = Expression.Constant(Convert.ChangeType(convertedNo, tParam));
var exp = Expression.Call(property, method, number);
var minDate = Expression.Constant(Convert.ChangeType(DateTime.MinValue, typeof(DateTime)));
var minDateCheck = Expression.MakeBinary(ExpressionType.Equal, property, minDate);
var minDateExp = Expression.IfThenElse(minDateCheck, minDate, exp);
/* To allow for left property < DOB == DateTime.Min ? DateTime.Min : DOB.AddMinutes(60) */
return Expression.MakeBinary(ExpressionType.LessThan, left, minDateExp); // Exception thrown here
}
var expression=newstring[]{“DOB”、“-”和“180”};
var property=Expression.property(参数,表达式[0]);
var method=typeof(T).GetProperty(表达式[0]).PropertyType.GetMethod(“AddMinutes”);
/*如果我们有一个AddMinutes方法,那么假设类型是DateTime*/
if(方法!=null)
{
var tParam=method.GetParameters()[0].ParameterType;
/*计算一下我们是加还是减分钟*/
var convertedNo=表达式[1]=“-”?int.Parse(表达式[2])*-1:int.Parse(表达式[2]);
变量编号=表达式常数(Convert.ChangeType(convertedNo,tParam));
var exp=Expression.Call(属性、方法、编号);
var minDate=Expression.Constant(Convert.ChangeType(DateTime.MinValue,typeof(DateTime));
var minDateCheck=Expression.MakeBinary(ExpressionType.Equal,property,minDate);
var minDateExp=表达式.IfThenElse(minDateCheck,minDate,exp);
/*允许左属性
不幸的是,这会引发异常-无法将DateTime与返回类型void进行比较。我尝试过几种变体,但总是得到相同的例外
有人能告诉我如何构造一个表达式来实现这个逻辑吗?
表达式。如果其他的
等价于C#-嗯,if
语句,而你需要的是C#(又称a条件)操作符的表达式等价物,它是由方法产生的
很快,更换
var minDateExp = Expression.IfThenElse(minDateCheck, minDate, exp);
与
你完成了。像我这样的情况是在一个测试程序中做的?DateTime.Min:DOB.AddMinutes(60)然后查看调试器中的
test
,查看编译器是如何生成它的。有趣的是,我的一个测试发现了这个问题!。谢谢你的提示,我以后会尝试一下。太好了,真是一种享受——我希望这是我错过的简单的东西。我很感谢你的帮助和解释——我很高兴知道我将要建立的其他表达方式。再次感谢。
var minDateExp = Expression.Condition(minDateCheck, minDate, exp);