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
aufConsole.WriteLine(InvokeMethod(new Func<string,int>(Method1), "MyString1"));
Console.WriteLine(InvokeMethod(new Func<string, int>(Method2), "MyString2"));