Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 使用Linq表达式返回默认日期时间_C#_Linq_Datetime_Expression - Fatal编程技术网

C# 使用Linq表达式返回默认日期时间

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

我正试图为一个规则引擎构建一些额外的功能,我正在使用基于本文的表达式树-

我的规则之一是,如果发现某个属性类型是DateTime,则向该属性添加分钟。例如,我可以有“DOB+60”或“DOB-180”

我当前的代码适用于此:

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