Pass Method as Parameter using C#

后端 未结 12 1366
不知归路
不知归路 2020-11-21 23:30

I have several methods all with the same parameter types and return values but different names and blocks. I want to pass the name of the method to run to another method tha

相关标签:
12条回答
  • 2020-11-22 00:20

    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);
        }
    }
    
    0 讨论(0)
  • 2020-11-22 00:21

    If you want the ability to change which method is called at run time I would recommend using a delegate: http://www.codeproject.com/KB/cs/delegates_step1.aspx

    It will allow you to create an object to store the method to call and you can pass that to your other methods when it's needed.

    0 讨论(0)
  • 2020-11-22 00:24

    Here is an example Which can help you better to understand how to pass a function as a parameter.

    Suppose you have Parent page and you want to open a child popup window. In the parent page there is a textbox that should be filled basing on child popup textbox.

    Here you need to create a delegate.

    Parent.cs // declaration of delegates public delegate void FillName(String FirstName);

    Now create a function which will fill your textbox and function should map delegates

    //parameters
    public void Getname(String ThisName)
    {
         txtname.Text=ThisName;
    }
    

    Now on button click you need to open a Child popup window.

      private void button1_Click(object sender, RoutedEventArgs e)
      {
            ChildPopUp p = new ChildPopUp (Getname) //pass function name in its constructor
    
             p.Show();
    
        }
    

    IN ChildPopUp constructor you need to create parameter of 'delegate type' of parent //page

    ChildPopUp.cs

        public  Parent.FillName obj;
        public PopUp(Parent.FillName objTMP)//parameter as deligate type
        {
            obj = objTMP;
            InitializeComponent();
        }
    
    
    
       private void OKButton_Click(object sender, RoutedEventArgs e)
        {
    
    
            obj(txtFirstName.Text); 
            // Getname() function will call automatically here
            this.DialogResult = true;
        }
    
    0 讨论(0)
  • 2020-11-22 00:27

    Here is an example without a parameter: http://en.csharp-online.net/CSharp_FAQ:_How_call_a_method_using_a_name_string

    with params: http://www.daniweb.com/forums/thread98148.html#

    you basically pass in an array of objects along with name of method. you then use both with the Invoke method.

    params Object[] parameters

    0 讨论(0)
  • 2020-11-22 00:31

    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.

    0 讨论(0)
  • 2020-11-22 00:36

    From OP's example:

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

    You can try Action Delegate! And then call your method using

     public bool RunTheMethod(Action myMethodName)
     {
          myMethodName();   // note: the return value got discarded
          return true;
     }
    
    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"));
    
    0 讨论(0)
提交回复
热议问题