检查委托是否是对象的方法,并检索此对象引用和方法名称

时间:2017-04-08 18:38:13

标签: c# methods reference delegates

我想知道给定一个委托变量是否可行,知道它是否实际指向一个对象方法,并检索该对象和方法的名称。

e.g:

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();
} 

1 个答案:

答案 0 :(得分:2)

是的,委托包含了几个属性。第一个是Target(目标对象),第二个是Method(类型MethodInfo)。

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);
    }
}