2

有没有办法强制 C# 编译器忽略缺少的对象运算符重载,而是在运行时处理该检查?我问是因为我有一个容器,其中包含多个对象,这些对象具有 int、string、ushort 等类型的各种属性。我正在为该容器创建搜索功能,并希望能够搜索各个字段。

我正在使用谓词和 lambda 表达式。

这就是我要的:

var data = container.Retrieve(ID => (ID == 5), Date => (Date > somedate));

假设 ID 和 Date 是容器对象中的字段

这就是我今天必须做的(虽然它有效):

var data = container.Retrieve(ID => ((int)ID == 5), Date => ((DateTime)Date > somedate));

与第一个示例相比,额外的铸件看起来不是很好,我不想这样做。我希望可以选择在运行时检查它。

有没有办法做到这一点?

4

1 回答 1

3

不,C# 3.0 不支持不知道类型的运算符。

在 C# 4.0 中,您可以使用 来执行此操作dynamic,但速度较慢。

在您的情况下,您知道类型应该是什么 - 所以只需转换(就像您一样)。


在更一般的情况下:

对于未知类型,请查看Comparer.Default.Compareobject.Equals...

使用泛型;看看Comparer<T>.Default.Compare(x,y)- 这应该做你需要的一切>>=和(包括空值等)<<=同样EqualityComparer<T>.Default.Equals(x,y)处理==!=(包括空值等)。

有关更多运算符(+,-*) - 查看MiscUtil

于 2009-07-03T11:35:43.400 回答