2017-04-08 1 views
1

위임 변수가 주어진다면 가능한지 알고 싶습니다. 실제로 개체 메서드를 가리키고 있는지 확인하고 싶습니다. 이 객체와 메소드의 이름을 가져옵니다.대리자가 개체의 메서드인지 확인하고이 개체 참조 및 메서드 이름을 검색하십시오.

는 예컨대 :

public delegate void test(); 
public static test testDel = null; 
public void TestMethod() 
{ 
    ; 
} 
public void TestDelegate() 
{ 
    //here it is not a method of an object 
    testDel +=() => { }; 
    // here it is "TestMethod" 
    testDel += this.TestMethod; 
    // i want something like that: 
    SomeDelegateInfoClass[] infos = testDel.GetAssignedObjectsAndMethodNames(); 
} 

답변

2

예는, 위임 그냥 속성의 몇 수 포함되어 있습니다. 첫 번째 개체는 Target (대상 개체)이고 두 번째 개체는 인 Method입니다.

var target = testDel.Target; // null for static methods 
var methodName = testDel.Method.Name; 

참고 그러나 그이 경우

testDel =() => { }; 

에서 이것이 "대상이 아니 방법"이라고 사실이 아니다. 컴파일러는 새로운 타입을 만들 것이고 당신의 빈 익명 함수는 그 타입의 메소드가 될 것입니다. 그래서 또한이 같은 위임하기 위해 여러 방법을 추가하면 것을

testDel =() => { }; 
var targetType = testDel.Target.GetType().Name; // will be something like <>c - name of compiler-generated type 
var m = testDel.Method.Name; // will be something like <Main>b__2_0 - compiler generated name 

참고 :

testDel +=() => { };  
testDel += this.TestMethod; 

TargetMethod 정보에 대한 마지막 추가 방법이 포함됩니다. 그들 모두에 대한 정보를 얻으려면, 당신은 GetInvocationList를 사용해야합니다 : 내가 필요 정확히

if (testDel != null) { 
    foreach (var del in testDel.GetInvocationList()) { 
     Console.WriteLine(del.Target); 
     Console.WriteLine(del.Method); 
    } 
} 
+0

은, 대단히 감사합니다 ^^. –

관련 문제