2016-06-01 7 views
1

Ist es möglich, eine Methode aufzurufen, ohne ihren Namen zu kennen? Ich stelle mir vor, es ist eine Methode, die als eine Variable wie folgt gespeichert wird:Wie kann man eine Methode aufrufen, ohne ihren Namen in C# zu kennen?

public static Method Example; 

private static void DoSomething() 
{ 
    //Something 
} 

private static void Main() 
{ 
    Example = DoSomething(); 
} 

public static void ExecuteSomething() 
{ 
    Example(); 
} 

Gibt es sowas oder ähnliche Funktion? Ich habe Delegierte angeschaut und bin mir nicht sicher, ob ich sie richtig verstehe oder ob ich danach suche.

+6

Delegierten werden genau das, was Sie suchen. –

+2

Ändern Sie 'public static method Example' in' public static Action Example', aber Sie benötigen weiterhin seinen Namen, um darauf Bezug zu nehmen, wenn Sie assemblieren – haim770

+0

Auch würde die Zuweisung aussehen wie 'Example = DoSomething;' (ohne '') ') –

Antwort

2

Was Sie beschreiben, heißt delegate. Sie können in den Deklarationen der Variablen/field/property/eventhandler verwendet werden. C# enthält einige nützliche Generics, mit denen Sie die erwartete Funktion beschreiben können. Einige Beispiele:

Action      // A void function 
Action<T>     // A void function that accepts a parameter of type T 
Action<Tin1, Tin2, ...>  // A void function that accepts Tx parameters 

Func<T>      // A function that returns an object of type T 
Func<Tout, Tin1, Tin2, ...> // A function that returns Tout an accepts Tx as parameters 

Predicate<T>    // A function that returns bool and accepts parameter T 

Oder wenn Sie möchten, dass Ihre eigenen Delegierten mit dem delegate Stichwort schreiben:

delegate void MySpecialEventHandler(object sender, object data) 

Beispiel:

//EventHandler definition 
public delegate void PrintedSomethingEventHandler(string message); 

//Event 
public event PrintedSomethingEventHandler PrintedSomething; 

//e.g. "Function Hook" 
private Func<string,string> _externalFilter; 

public void SetFilter(Func<string,string> filter) 
{ 
    _externalFilter = filter; 
} 

private void PrintA(string message) 
{ 
    Debug.WriteLine(message); 
} 

private void PrintB(string message) 
{ 
    Console.WriteLine(message); 
} 

private bool ContainsProfanity(string message) 
{ 
    return message.Contains("%$&!"); 
} 

public void Print(string message, bool debug) 
{ 
    Action<string> action; 
    Predicate<string> filter = ContainsProfanity; 

    if(filter(message)) 
     return; 

    if(_externalFilter != null) 
     message = _externalFilter(message); 

    if(debug) 
     action = PrintA; 
    else 
     action = PrintB; 

    action(message); 

    if(PrintedSomethingEventHandler != null) 
     PrintedSomethingEventHandler(message); 
} 
+0

Auch, [link] (https://msdn.microsoft.com/en-us/library/ ms173171.aspx) an MSDN für weitere Informationen –

+0

Vielen Dank, ich habe es funktioniert! Ich denke, ich hätte die Delegierten weiter recherchieren sollen. – Cryru