2010-04-20 3 views
0

리플렉션을 사용하여 클래스 A에서 메서드 M1을 호출한다고 가정 해 보겠습니다. 메서드가 존재하지 않습니다..Net Reflection - 존재하지 않는 메서드 호출

클래스 A에 "누군가 M1 메서드를 실행하려고합니다"라는 처리기를 추가 할 수있는 방법이 있습니까?

또는

동적으로 클래스에 메서드를 추가 할 수 있습니까? M1 ... Mn 메서드를 추가하고 싶습니다. 항상 MyStaticClass.DoAction ("M1 ... Mn")을 수행합니다.

다음과 같음 :

문자열 methodName = "M1".

A.AddMethod (methodname, x => MyStaticClass.DoAction (x));

+0

리플렉션을 사용하지 않고도 C# 4의 동적 오브젝트를 사용하여 정확히 수행 할 수 있습니다. –

답변

1

실제로 C# 4.0에서이 작업을 수행하는 쉬운 방법이 있습니다. .

이것은 머리 기사가 될 것입니다. 그러나 코드를 안전하게 만들기 위해 조금 더 선언해야한다는 것을 기억하십시오.

class DynamicTester : DynamicObject 
{ 
    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) 
    { 
     Console.WriteLine("Someone is calling method {0}", binder.Name); result = null; return true; 
    } 
    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     Console.WriteLine("Someone is trying to get attribute {0}", binder.Name); result = null; return true; 
    } 
    public override bool TrySetMember(SetMemberBinder binder, object value) 
    { 
     Console.WriteLine("Someone is trying to set attribute {0} to value {1}", binder.Name, Convert.ToString(value)); return true; 
    } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     dynamic dt = new DynamicTester(); 
     dt.A = "Test"; dt.B = 14; dt.date = DateTime.Now; 
     var i = dt.Z; 
     dt.Tester(1, 2, 3); 
    } 
} 

핵심 부분은 데이터 유형으로 동적을 사용하는 것입니다. 컴파일 타임에 메소드/애트리뷰트 호출을 해결하지 말고 런타임시 자신의 코드로도 해결하도록 시도한다.

은 전에 완료해야했던 ​​전체 리팩터링을 단순화합니다.

1

DLR, 특히 DynamicObject.TryInvokeMember이 필요합니다. 본질적으로 원하는만큼 많은 일반 멤버로 DynamicObject를 덮어 쓰고 런타임시 다른 메소드 호출을 처리하기 위해 TryInvokeMember를 제공합니다.

+0

니스, 알아 들었어. C# 4.0을 사용하려면 VS2010을 사용해야합니까? –

+0

No. Mono에는 이미 System.Dynamic에 대한 기본 지원이 있습니다. –

관련 문제