TryBinaryOperation의 설명서에 따르면이 메서드는 이진 연산의 왼쪽이 동적 개체 일 때 호출됩니다.DynamicObject 이진 연산의 바인딩 동작은 연산자와 피연산자에 따라 다릅니다
동적 객체에서 파생되는 클래스가 있는데 항상 그런 것처럼 보이지는 않습니다. 이 예를 들어 나는 나의 재정 TryBinaryOperation
3 호출을 기대하지만 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를 사용하고 있습니다. 이진 작업이 아니다
DLR이 스택에없는 것을 확인하는 것도 흥미 롭습니다. 컴파일 된 callsite 대리자 만 볼 수 있습니다. – usr