我最近正在使用一些动态搜索表达式,当我尝试搜索多个日期/时间时遇到了一个问题。

我的SearchExpression构造函数类似于以下内容(为简便起见,省略了一些):

public SearchExpression(string propertyName,
                        ComparisonOperator comparisonOperator,
                        object value) {...}




public SearchExpression(string propertyName,
                        ComparisonOperator comparisonOperator,
                        object[] values,
                        BooleanOperator innerBooleanOperator) {...}


当通过以下操作时,这两种方法均应按预期工作:


弦乐
数字(或任何数字数据)


但是,在传递DateTime信息时,我开始遇到一些问题。

当我根据类型(DateTime,Numeric或String)输入所有数据时,我将所有数据分开并检查有效性,然后将它们存储到数组中以传递给正确的表达式,如下所示:

object[] stringParameters;
object[] numericalParameters;
DateTime[] dateParameters;


当我传递以上任何内容时,所有这些工作都可以进行,但DateTime参数数组除外。

因此,我的问题让我感到有些愚蠢,那就是为什么我可以将单个DateTime值作为对象传递,却不能将DateTime[]作为object[]传递。

例:

DateTime[] dateParameters;

//This works fine
new SearchExpression("DateTime", ComparisonOperator.Equals, dateParameters[0]);

//This fails to work
new SearchExpression("DateTime", ComparisonOperator.Equals, dateParameters,
                     BooleanOperator.Or);

最佳答案

这是Covariance固有的问题,哪些数组不支持数组不支持值类型。

埃里克·利珀特(Eric Lippert)在here上有一篇很好的文章。





将方法签名更改为IEnumerable<object>

09-11 19:20
查看更多