通过反射获取C#中委托集合的所有具体实现

通过反射获取C#中委托集合的所有具体实现,c#,methods,reflection,delegates,concrete,C#,Methods,Reflection,Delegates,Concrete,是的,我试着缩小标题,但我做不到 我对反思非常陌生,所以我正在努力解决一个我甚至不知道是否有可能解决的问题 我将使用一些简单的委托示例来描述它 public void Main() { var manager = new EvManager(); var class1 = new Class1(manager); var class2 = new Class2(manager); manager.ExecuteIt(5, 12); /* This

是的,我试着缩小标题,但我做不到

我对反思非常陌生,所以我正在努力解决一个我甚至不知道是否有可能解决的问题

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

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”委托属性能够访问它调用的所有方法的具体实现

这基本上就是我想要的:

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?
        }   
    }
}

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

您可以通过具有属性的
代理的
属性
获得每个拆分
代理的
方法信息

class EvManager {
    private SumDelegate sum;
    public void ExecuteIt(int a, int b) {
        var invocationList = sum.GetInvocationList();
        foreach (var m in invocationList) {
            var concreteMethodName = m.Method.Name;
        }   
    }
}

Method属性保存有关实际方法的信息:

var mName = m.Method.Name;

您可以将以下方法添加到
EvManager

public void ListDelegates()
{
    foreach (var m in sum.GetInvocationList())
    {
        Console.WriteLine(m.Method.Name);
    }
}
打电话给它会给你想要的:

MySum
MyOtherSum

看看
代表
类参考。

实际上,它非常简单。使用属性

class EvManager {
    private SumDelegate sum;
    public void ExecuteIt(int a, int b) {
        var invocationList = sum.GetInvocationList();
        foreach (var m in invocationList) {
            var concreteMethodName = m.Method.Name;
        }   
    }
}
检查此代码:

using System;

namespace ConsoleApplication2
{

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

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

        public void ExecuteIt(int a, int b)
        {
            foreach (var m in sum.GetInvocationList())
            {
                Console.WriteLine("{0}({1}, {2}) = {3}", m.Method.Name, a, b, m.DynamicInvoke(a, b));
            }

        }
    }

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

        public int FakeSum(int a, int b)
        {
            return a - b;
        }
    }

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

        public int RealSum(int a, int b)
        {
            return a + b;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var manager = new EvManager();
            var class1 = new Class1(manager);
            var class2 = new Class2(manager);

            manager.ExecuteIt(5, 12);
        }
    }
}
输出:

FakeSum(5, 12) = -7
RealSum(5, 12) = 17

对于正确性:您的代码与您在注释中描述的不一致。结果总是17。