Methode als Parameter mit C# übergeben

Methode als Parameter mit C# übergeben

Sie können den Func-Delegaten in .net 3.5 als Parameter in Ihrer RunTheMethod-Methode verwenden. Mit dem Delegaten Func können Sie eine Methode angeben, die eine Reihe von Parametern eines bestimmten Typs akzeptiert und ein einzelnes Argument eines bestimmten Typs zurückgibt. Hier ist ein Beispiel, das funktionieren sollte:

public class Class1
{
    public int Method1(string input)
    {
        //... do something
        return 0;
    }

    public int Method2(string input)
    {
        //... do something different
        return 1;
    }

    public bool RunTheMethod(Func<string, int> myMethodName)
    {
        //... do stuff
        int i = myMethodName("My String");
        //... do more stuff
        return true;
    }

    public bool Test()
    {
        return RunTheMethod(Method1);
    }
}

Sie müssen einen Delegaten verwenden . In diesem Fall nehmen alle Ihre Methoden einen string -Parameter und geben eine int zurück - Dies wird am einfachsten durch den Func<string, int> dargestellt Delegierter 1 . Ihr Code kann also mit einer so einfachen Änderung wie dieser korrekt werden:

public bool RunTheMethod(Func<string, int> myMethodName)
{
    // ... do stuff
    int i = myMethodName("My String");
    // ... do more stuff
    return true;
}

Delegierte haben zugegebenermaßen viel mehr Macht als diese. Mit C# können Sie beispielsweise einen Delegaten aus einem Lambda-Ausdruck erstellen , also könnten Sie Ihre Methode folgendermaßen aufrufen:

RunTheMethod(x => x.Length);

Dadurch wird eine anonyme Funktion wie diese erstellt:

// The <> in the name make it "unspeakable" - you can't refer to this method directly
// in your own code.
private static int <>_HiddenMethod_<>(string x)
{
    return x.Length;
}

und übergeben Sie diesen Delegaten dann an RunTheMethod Methode.

Sie können Delegaten für Ereignisabonnements, asynchrone Ausführung, Rückrufe – alle möglichen Dinge verwenden. Es lohnt sich, sie zu lesen, insbesondere wenn Sie LINQ verwenden möchten. Ich habe einen Artikel, der hauptsächlich ist über die Unterschiede zwischen Delegierten und Ereignissen, aber Sie können es trotzdem nützlich finden.

1 Dies basiert nur auf dem generischen Func<T, TResult> Delegattyp im Framework; Sie könnten ganz einfach Ihre eigenen deklarieren:

public delegate int MyDelegateType(string value)

und machen Sie dann den Parameter vom Typ MyDelegateType stattdessen.


Aus dem Beispiel von OP:

 public static int Method1(string mystring)
 {
      return 1;
 }

 public static int Method2(string mystring)
 {
     return 2;
 }

Sie können Action Delegate ausprobieren! Rufen Sie dann Ihre Methode mit

auf
 public bool RunTheMethod(Action myMethodName)
 {
      myMethodName();   // note: the return value got discarded
      return true;
 }

RunTheMethod(() => Method1("MyString1"));

Oder

public static object InvokeMethod(Delegate method, params object[] args)
{
     return method.DynamicInvoke(args);
}

Rufen Sie dann einfach Methode

auf
Console.WriteLine(InvokeMethod(new Func<string,int>(Method1), "MyString1"));

Console.WriteLine(InvokeMethod(new Func<string, int>(Method2), "MyString2"));