2014-04-26 2 views
2

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를 사용하고 있습니다. 이진 작업이 아니다

답변

7
dynamic d1 = d + "add it"; 

, 즉 문자열 연결입니다. 숫자 피연산자위한 플로우 확인하지 않고

가산 동작 : DynamicObject.TryBinaryOperation (MSDN에 대한 문서에서)의 추가 동작이 설명을 갖는다.

바인더는 이미 문자열을 연결하는 방법을 알고 있습니다. 필요한 것은 DynamicObject를 문자열로 변환하는 것입니다. 어떤이 있으며, toString() 재정의를 추가하여 볼 수 있습니다

public override string ToString() { 
     return base.ToString(); 
    } 

그것에 중단 점을 설정하고 중단 할 때 호출 스택에서 찾습니다!

ConsoleApplication327.exe ConsoleApplication327.MyDynamic.ToString을 () 줄 22 C# mscorlib.dll! string.Concat (개체 arg0, 개체 arg1) + 0x1e 바이트
System.Core.dll! System.Dynamic.UpdateDelegates.UpdateAndExecute2 (System.Runtime.CompilerServices.CallSite site, object arg0, 문자열 arg1) + 0x2ae 바이트
ConsoleApplication327.exe! 단점 oleApplication327.Program.Main (문자열 []에 args) 라인 30 + 0x146 바이트 C#을

라인 # 30 내 테스트 프로그램에서 d1 할당 문입니다.

+0

DLR이 스택에없는 것을 확인하는 것도 흥미 롭습니다. 컴파일 된 callsite 대리자 만 볼 수 있습니다. – usr

관련 문제