正如其他人所指出的,有多种方法可以模拟这一点,但 C# 中没有“烘焙”功能。最灵活的方法是使用反射,但如果您事先知道将要调用的方法列表,则可以采用更简单(也更容易处理)的方式。
class Foo
{
public static string FooA(int p1, int p2)
{
return "FooA:" + p1 + p2;
}
public static string FooB(int p1, int p2) { return "FooB:" + p1 + p2; }
public static string FooC(int p1, int p2) { return "FooC:" + p1 + p2; }
}
class Bar
{
//You can use Func<int, int, object> instead of a delegate type,
//but this way is a little easier to read.
public delegate string Del(int p1, int p2);
public static string DoStuff()
{
var classes = new Dictionary<string, Dictionary<string, Del>>();
classes.Add("Foo", new Dictionary<string, Del>());
classes["Foo"].Add("FooA", Foo.FooA);
classes["Foo"].Add("FooB", Foo.FooB);
classes["Foo"].Add("FooC", Foo.FooC);
//...snip...
return classes["Foo"]["FooA"](5, 7);
}
}
顺便说一句,这确实有效。
如果您不知道要以这种方式提供哪些方法,我建议您重新考虑您尝试执行的操作。我能想到的使用字符串来选择执行路径的唯一原因是,如果您打算从用户那里获取这些字符串。像这样暴露应用程序的内部细节不仅是一个巨大的禁忌,而且它非常接近eval
-type 功能。C# 没有eval
方法是有原因的,并不是因为设计者忘记把它放进去。