使用C#将参数传递为参数

我有几个方法都具有相同的签名(参数和返回值),但名称不同,并且方法的内部是不同的。 我想将方法​​的名称传递给另一个将调用传入方法的方法。

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);
}

此代码不起作用,但这是我想要做的。 我不明白的是如何编写RunTheMethod代码,因为我需要定义参数。


您可以使用.net 3.5中的Func委托作为RunTheMethod方法中的参数。 Func委托允许你指定一个方法,该方法接受一些特定类型的参数并返回一个特定类型的单个参数。 这是一个应该工作的例子:

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);
    }
}

您需要使用委托。 在这种情况下,您的所有方法都接受一个string参数并返回一个int - 这最简单的代表是Func<string, int> delegate1。 所以你的代码可以通过这样简单的改变而变得正确:

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

诚然,代表们拥有比这更多的权力。 例如,用C#可以从lambda表达式创建一个委托,所以你可以用这种方式调用你的方法:

RunTheMethod(x => x.Length);

这将创建一个匿名函数,如下所示:

// 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;
}

然后将该委托传递给RunTheMethod方法。

您可以使用委托进行事件订阅,异步执行,回调 - 各种各样的事情。 非常值得关注它们,特别是如果你想使用LINQ。 我有一篇主要关于代表与事件之间差异的文章,但您可能会发现它很有用。


1这只是基于框架中的通用Func<T, TResult>委托类型; 你可以轻松地声明自己的:

public delegate int MyDelegateType(string value)

然后将该参数改为MyDelegateType类型。


你也可以尝试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;
 }

然后使用你的方法

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

要么

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

然后简单地调用方法

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

Console.WriteLine(InvokeMethod(new Func<string, int>(Method2), "MyString2"));
链接地址: http://www.djcxy.com/p/21359.html

上一篇: Pass Method as Parameter using C#

下一篇: When to use ref vs out