我有几个方法都具有相同的签名(参数和返回值),但不同的名称和方法的内部是不同的。我想传递该方法的名称运行到另一个方法,将调用传入的方法。
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代码,因为我需要定义参数。
你需要使用一个委托。在这种情况下,你所有的方法都带一个string参数,并返回一个int- 这个代表最简单的Func<string, int>代表1。所以你的代码可以通过这样简单的改变而变得正确:
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。
你可以使用.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);
}
}