c# - 通过反射在 C# 中获取委托(delegate)集合的所有具体实现

标签 c# methods reflection delegates concrete

是的,我试图让标题变小,但我做不到。

我对反射还很陌生,所以我正在努力解决一个我什至不知道是否有可能解决的问题。

我将使用一些简单的委托(delegate)示例来描述它。

public void Main() {
    var manager = new EvManager();
    var class1 = new Class1(manager);
    var class2 = new Class2(manager);

    manager.ExecuteIt(5, 12);
    /*
    This outputs:
    In Class1 -> 17
    In Class2 -> 18
    */
}

public class EvManager {
    public delegate void SumDelegate(int a, int b);
    private SumDelegate sum;

    public void AddDelegate(SumDelegate s) {
        sum += s;
    }

    public void ExecuteIt(int a, int b) {
        sum.Invoke(a, b);
    }
}

public class Class1 {
    public Class1(EvManager m) {
        m.AddDelegate(MySum);
    }

    private void MySum(int a, int b) {
        Console.Write("In Class1 -> " + (a + b));
    }
}

public class Class2 {
    public Class2(EvManager m) {
        m.AddDelegate(MyOtherSum);
    }

    private void MyOtherSum(int a, int b){
        Console.Write("In Classe2 -> " + (a + b));
    }
}

好的,这就是例子。我想从中得到什么?我希望通过 EvManager 的“sum”委托(delegate)属性能够访问它调用的所有方法的具体实现。

这基本上就是我想要的:

class EvManager {
    private SumDelegate sum;
    public void ExecuteIt(int a, int b) {
        var invocationList = sum.GetInvocationList();
        foreach (var m in invocationList) {
            // m is a reference to the annonymous call.
            // Through reflection, I want to access the concrete method name.
            // In this case, the first iteration "MySum", and the second "MyOtherSum"
            // Is this possible?

            // Like...
            // var concreteMethodName = m.GetMethod().ConcreteCallerType.GetMethod(m.GetConreteMethodName());
            // Or something like that?
        }   
    }
}

希望我说清楚了我的问题,这让我很痛苦。

最佳答案

Method 属性包含有关实际方法的信息:

var mName = m.Method.Name;

关于c# - 通过反射在 C# 中获取委托(delegate)集合的所有具体实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30127463/

相关文章:

java - 如果只有完全限定名称,如何获取 java 类的二进制名称?

c# - ASP.NET MVC 4 Facebook FacebookContext - 如何获取引用

java - 方法——继续

java - 为什么我的 setter 和 getter 方法不起作用?

c# - 检查对象的实例是否是只读的

c# - 通过反射在复制的列表中设置属性更新原始列表

c# - 使用 Blazor 中的按钮向左/向右滚动

c# - 将列表类型转换为 IEnumerable 接口(interface)类型

c# - 如何在 Razor mvc5 中每第 3 列创建一行?

c++ - 在 C++ 中将值作为类的成员传递给 vector