根据TryBinaryOperation的文档,当二进制操作的左侧是动态对象时,将调用此方法。
我有一个派生自动态对象的类,并且发现情况似乎并非总是如此。对于这个例子,我希望我的覆盖有 3 次调用,TryBinaryOperation
但只得到 2 次。
public class MyDynamic : DynamicObject
{
public override bool TryBinaryOperation(BinaryOperationBinder binder, object arg, out object result)
{
Console.WriteLine("operation = " + binder.Operation.ToString());
result = arg;
return true;
}
}
class Program
{
static void Main(string[] args)
{
dynamic d = new MyDynamic();
dynamic d1 = d + "add it";
dynamic d2 = d + 1;
dynamic d3 = d >> "shift it";
Console.WriteLine("");
Console.WriteLine(d1);
Console.WriteLine(d2);
Console.WriteLine(d3);
}
}
然而,第一次调用返回字符串“ DynamicRestProxy.UnitTests.MyDynamicadd it
”;即被d.ToString() + "add it"
加法运算符调用,而不是尝试我的动态类的二进制操作。此外,如果“+”的右手运算符是 int,则尝试动态操作。
上述程序的输出是(注意调用d + "add it"
没有到达TryBinaryOperation
):
operation = Add
operation = RightShift
DynamicRestProxy.UnitTests.MyDynamicadd it
1
shift it
我希望它在哪里
operation = Add
operation = Add
operation = RightShift
add it
1
shift it
这是正确的预期行为吗?如果是这样,是否有更多的文档可以解释?
这是使用 VS.NET 2013 和 .NET 4.5。