【问题标题】:How to make objects "assume" they got overload for operator X?如何让对象“假设”它们为操作员 X 过载?
【发布时间】:2009-07-03 11:30:35
【问题描述】:

有没有办法强制 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));

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

有没有办法做到这一点?

【问题讨论】:

    标签: c# lambda operator-overloading predicate


    【解决方案1】:

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

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

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


    在更一般的情况下:

    未知类型,看Comparer.Default.Compareobject.Equals...

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

    更多运营商 (+,-,* 等) - 查看MiscUtil

    【讨论】:

    • 好吧,那我就接受我的演员表了。为快速回答干杯。 :)
    • @Hallgeir:如果您使用自己的对象,或者可以从它们派生,则可以使用隐式转换运算符重载。不确定这是否适用于您的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 2021-06-19
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多