他の人が指摘しているように、これをシミュレートする方法は複数ありますが、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
タイプの機能に危険なほど近づいてしまいます。C# にeval
メソッドがないのには理由があり、それは設計者がメソッドを入れるのを忘れたからではありません。