2010-03-04 3 views
5

C# 4.0에는 새로운 DynamicObject가 있습니다.C# 4.0 - 동적 개체 호출에서 보호 된 메서드를 호출합니까 TryInvokeMember()?

존재하지 않는 메서드를 호출 할 때 호출되는 TryInvokeMember() 메서드 인 "마법 메서드"를 제공합니다. 내가 알고 싶은 무엇

http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.tryinvokemember%28VS.100%29.aspx

는 정의 클래스 외부에서 보호 된 메서드를 호출 할 때 TryInvokeMember()가 호출되는 경우입니다.

필자는이 상황에서 PHP와 동작을 대조하는 "마법 메서드"인 __call()을 사용합니다.

+6

이 시나리오에서는 내가 할 수있는 첫 번째 일은 시도해보아야합니다. – spronkey

답변

6

표준 C# 액세스 규칙을 사용하여 액세스 할 수없는 메서드를 호출하는 호출을 작성하면 액세스 할 수없는 메서드가 호출되지 않고 런타임에서 TryInvokeMember (호출을 처리 할 수있는 곳)이 호출됩니다. 다른 방법으로). 이제

class Test : DynamicObject { 
    public void Foo() { 
    Console.WriteLine("Foo called"); 
    } 
    protected void Bar() { 
    Console.WriteLine("Bar called"); 
    } 

    public override bool TryInvokeMember 
     (InvokeMemberBinder binder, object[] args, out object result) { 
    Console.WriteLine("Calling: " + binder.Name); 
    return base.TryInvokeMember(binder, args, out result); 
    } 
} 

, 우리가 개체의 인스턴스를 만들 수 있습니다 및 그 방법 중 몇 가지를 호출하려고 : 당신이를 호출하는 경우, 그래서

dynamic d = new Test(); 
d.Foo(); // this will call 'Foo' directly (without calling 'TryInvokeMember') 
d.Bar(); // this will call 'TryInvokeMember' and then throw exception 

을 당신이 그것을 시도 할 수 있도록 다음은 그 예이다 base 구현이 TryInvokeMember이면 액세스 할 수없는 메서드를 호출 할 때 C# 동적 바인더가 실패하지만 result을 설정하고 true을 반환하여 TryInvokeMember에 사용자가 직접 처리를 정의 할 수 있습니다.

+1

문제를 명확히하기 위해서입니다. 기본 바인더를 호출하기 때문에 예외가 발생합니다. "return base.TryInvoke"를 "result = null; return true;"와 같은 것으로 변경하십시오. 예외를 피하기 위해 당신은 아마 그것을 의미하지는 않았지만 지금은 보호 된 메서드를 호출하면 항상 예외가 발생하는 것처럼 보입니다. (또는 내 기술 작가 nit-picking입니까?) –

+0

Tomas, Tomas, 마지막 문장. 우리는 얼마나 오래 기다려야합니까? – KMX