0

使用DynamicObject它可以创建自定义类并在将实例与其他对象进行比较时定义其行为。它是通过覆盖来完成的TryBinaryOperation

但是,当我尝试将它与null任何参考值进行比较时,永远不会调用被覆盖的方法。

public class Foo : DynamicObject
{
    public override bool TryBinaryOperation(BinaryOperationBinder binder, object arg, out object result)
    {
        if (binder.Operation == ExpressionType.Equal)
        {
            result = true;
            return true;
        }

        return base.TryBinaryOperation(binder, arg, out result);
    }
}

static void Main(string[] args)
{
    dynamic foo = new Foo();

    Console.WriteLine(foo == 1); // True
    Console.WriteLine(foo == new object()); // False
    Console.WriteLine(foo == null); // False
}

有没有办法拦截这个电话?我认为DynamicObject这不是正确的抽象。

4

1 回答 1

0

是的,您可以通过运算符重载。事实上,我使用这个技巧在我的 DynamicLinq 项目中实现了一个动态表达式构建器。在此处查看示例:

https://github.com/davidfowl/DynamicLinq/blob/master/DynamicLINQ/DynamicExpressionBuilder.cs#L88

于 2012-11-17T00:51:55.670 回答