2011-11-24 53 views
2

可能重複:
How to Call method using its name?呼叫的方法動態地基於一些其它可變

生病使用交換機/ case語句。我想知道是否有某種方法可以根據用戶提供的值調用方法。要知道,有可能是一萬個理由,爲什麼這是一個壞主意,但在這裏就是我想:

Console.Write("What method do you want to call? "); 
string method_name = Console.ReadLine(); 

然後以某種方式調用包含在「METHOD_NAME」的方法。這甚至有可能嗎?

回答

0

如果你想,你可以以某種方式做到這一點:

Console.Write("What method do you want to call? "); 
string method_name = Console.ReadLine(); 
method_name(); 

你就錯了。您必須分析用戶輸入並根據該輸入調用方法。如果你想要的類型是動態的,以及該方法然後用這個來代替typeof(MyClass)

var type = typeof(MyClass); 
var method = type.GetMethod(method_name); 
method.Invoke(obj, params); 

4

您可以使用反射

var type = Type.GetType(type_name); 
1

你的樣品

public class Boss 
{ 
    public void Kick() 
    { 
     Console.WriteLine("Kick"); 
    } 
    public void Talk(string message) 
    { 
     Console.WriteLine("Talk " + message); 
    } 
    public void Run() 
    { 
     Console.WriteLine("Run"); 
    } 
} 

class Program 
{ 
    static void AutoSwitch(object obj, string methodName, params object[] parameters) 
    { 
     var objType = typeof(obj); 
     var method = objType.GetMethod(methodName); 
     method.Invoke(obj, parameters); 
    } 

    static void Main(string[] args) 
    { 
     var obj = new Boss(); 

     AutoSwitch(obj, "Talk", "Hello World"); 
     AutoSwitch(obj, "Kick"); 
    } 
} 
3

而是反思的,如果你有作用於用戶的輸入值W/O使用switch語句,你可以使用具有映射對輸入值的方法列表的字典。

private static void Method1(int x) 
    { 
     Console.WriteLine(x); 
    } 

    private static void Method2(int x) 
    { 
    } 

    private static void Method3(int x) 
    { 
    } 

    static void Main(string[] args) 
    { 
     Dictionary<int, Action<int>> methods = new Dictionary<int, Action<int>>(); 
     methods.Add(1, Method1); 
     methods.Add(2, Method2); 
     methods.Add(3, Method3); 


     (methods[1])(1); 
    } 
+0

如果方法類型是字符串,它有多個參數..例如,字符串emilvalid(字符串x1,字符串x2)和字符串regExp(字符串錯誤)..都返回字符串..你能告訴我如何要做到這一點......以及使用什麼insted的行動..#行動只是無效的方法..和功能是返回的方法..但它仍然給錯誤.. – nikunjM

1

我所看到的處理(讀忌)switch語句的另一種有趣的方式不同的是使用的方法的字典。我偷了這個來自http://www.markhneedham.com/blog/2010/05/30/c-using-a-dictionary-instead-of-if-statements/,它看起來像他們正在使用的MVC框架,但同樣的基本原則適用

public class SomeController 
{ 
private Dictionary<string, Func<UserData,ActionResult>> handleAction = 
    new Dictionary<string, Func<UserData,ActionResult>> 
    { { "Back", SaveAction }, 
     { "Next", NextAction }, 
     { "Save", SaveAction } }; 

public ActionResult TheAction(string whichButton, UserData userData) 
{ 
    if(handleAction.ContainsKey(whichButton)) 
    { 
     return handleAction[whichButton](userData); 
    } 

    throw Exception(""); 
} 

private ActionResult NextAction(UserData userData) 
{ 
    // do cool stuff 
} 
} 
5

很多時候,你可以重構switch語句到字典...

switch (caseSwitch) 
{ 
    case 1: 
     Console.WriteLine("Case 1"); 
     break; 
    case 2: 
     Console.WriteLine("Case 2"); 
     break; 
    case 3: 
     Console.WriteLine("Case 3"); 
     break; 
} 

能成。 ...

var replaceSwitch = new Dictionary<int, Action> 
    { 
     { 1,() => Console.WriteLine("Case 1") } 
     { 2,() => Console.WriteLine("Case 2") } 
     { 3,() => Console.WriteLine("Case 3") } 
    } 

... 

replaceSwitch[value](); 

這是一個非常微妙的轉變,似乎並沒有獲得太多的收益,但實際上它好多了,好多了。如果你想知道爲什麼,這個blog post解釋得很好。