我有几个方法都具有相同的参数类型和返回值,但名称和块不同。我想将要运行的方法的名称传递给另一个将调用传递的方法的方法。
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代码,因为我需要定义参数。
您需要使用代理。在这种情况下,所有方法都接受一个字符串参数并返回一个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类型。
根据OP的示例:
public static int Method1(string mystring)
{
return 1;
}
public static int Method2(string mystring)
{
return 2;
}
你可以试试行动代表!然后使用
public bool RunTheMethod(Action myMethodName)
{
myMethodName(); // note: the return value got discarded
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"));