2016-11-09 2 views
3

Ich habe eine statische Liste wie folgt aus:Method to Action in C#

class Program 
{ 
    public static List<Action> List { get; set; } = new List<Action>(); 
    static void Main(string[] args) 
    { 
     Test test = new Test(); 
     test.Work(); 
     var type = test.GetType(); 
     var method = type.GetMethod("Action1",System.Reflection.BindingFlags.Instance|System.Reflection.BindingFlags.NonPublic); 
     //Console.WriteLine(List.Any(p => p == new Action(method.))); 
    } 
} 
public class Test 
{ 
    public void Work() 
    { 
     Program.List.Add(new Action(Action1)); 
    } 
    private void Action1() 
    { 

    } 
} 

Wie kann ich die Program.List enthält Action1 durch Reflexion richten?

Wenn die Action1 Verfahren öffentlich ist, kann ich tun, wie folgt:

Console.WriteLine(List.Any(p => p == new Action(test.Action1))); 

Und es wird gedruckt "True";

+0

das nicht möglich ist. Sie haben Ihren Code noch nicht fertiggestellt und fügen der Liste nichts hinzu. Sobald Sie dies tun, werden Sie feststellen, dass es Delegaten enthält, deren Methode method.Invoke() aufrufen wird. Dass diese Invoke() Aktion1 aufruft, kann nicht entdeckt werden. –

Antwort

1

Try this:

Console.WriteLine(List.Any(p => p.Method.MethodHandle.Value == method.MethodHandle.Value)); 
+0

Es ist Arbeit, aber können Sie "Action" übersetzen, Vielleicht hat es nur Action-Schnittstelle ausgesetzt? – HaibaraAi

+0

Vielleicht verwenden Sie Liste Oswald

+0

Ich denke, dass Aktion besser sein wird, weil die Methoden Parameter haben können und die Liste speichert die Methoden ohne Parameter. –

Verwandte Themen