Pass Method as Parameter using C#
I have several methods all with the same signature (parameters and return values) but different names and the internals of the methods are different. I want to pass the name of the method to run to another method that will invoke the passed in method.
public int Method1(string)
{
    ... do something
    return myInt;
}
public int Method2(string)
{
    ... do something different
    return myInt;
}
public bool RunTheMethod([Method Name passed in here] myMethodName)
{
    ... do stuff
    int i = myMethodName("My String");
    ... do more stuff
    return true;
}
public bool Test()
{
    return RunTheMethod(Method1);
}
This code does not work but this is what I am trying to do. What I don't understand is how to write the RunTheMethod code since I need to define the parameter.
You can use the Func delegate in .net 3.5 as the parameter in your RunTheMethod method. The Func delegate allows you to specify a method that takes a number of parameters of a specific type and returns a single argument of a specific type. Here is an example that should work:
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);
    }
}
 You need to use a delegate.  In this case all your methods take a string parameter and return an int - this is most simply represented by the Func<string, int> delegate1.  So your code can become correct with as simple a change as this:  
public bool RunTheMethod(Func<string, int> myMethodName)
{
    // ... do stuff
    int i = myMethodName("My String");
    // ... do more stuff
    return true;
}
Delegates have a lot more power than this, admittedly. For example, with C# you can create a delegate from a lambda expression, so you could invoke your method this way:
RunTheMethod(x => x.Length);
That will create an anonymous function like this:
// 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;
}
 and then pass that delegate to the RunTheMethod method.  
You can use delegates for event subscriptions, asynchronous execution, callbacks - all kinds of things. It's well worth reading up on them, particularly if you want to use LINQ. I have an article which is mostly about the differences between delegates and events, but you may find it useful anyway.
 1 This is just based on the generic Func<T, TResult> delegate type in the framework;  you could easily declare your own:  
public delegate int MyDelegateType(string value)
 and then make the parameter be of type MyDelegateType instead.  
You can also try Action Delegate!
 public static int Method1(string mystring)
 {
      return 1;
 }
 public static int Method2(string mystring)
 {
     return 2;
 }
 public bool RunTheMethod(Action myMethodName)
 {
      myMethodName();
      return true;
 }
And then call your method using
RunTheMethod(() => Method1("MyString1"));
Or
public static object InvokeMethod(Delegate method, params object[] args)
{
     return method.DynamicInvoke(args);
}
Then simply call method
Console.WriteLine(InvokeMethod(new Func<string,int>(Method1), "MyString1"));
Console.WriteLine(InvokeMethod(new Func<string, int>(Method2), "MyString2"));
上一篇: 如何将十进制值舍入为2个小数位(用于页面上的输出)
下一篇: 使用C#将参数传递为参数
