生病使用交換機/ case語句。我想知道是否有某種方法可以根據用戶提供的值調用方法。要知道,有可能是一萬個理由,爲什麼這是一個壞主意,但在這裏就是我想:
Console.Write("What method do you want to call? ");
string method_name = Console.ReadLine();
然後以某種方式調用包含在「METHOD_NAME」的方法。這甚至有可能嗎?
生病使用交換機/ case語句。我想知道是否有某種方法可以根據用戶提供的值調用方法。要知道,有可能是一萬個理由,爲什麼這是一個壞主意,但在這裏就是我想:
Console.Write("What method do you want to call? ");
string method_name = Console.ReadLine();
然後以某種方式調用包含在「METHOD_NAME」的方法。這甚至有可能嗎?
如果你想,你可以以某種方式做到這一點:
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);
:
您可以使用反射
var type = Type.GetType(type_name);
當然,reflection是你的朋友。看看Type.GetMethod()
。
你的樣品
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");
}
}
而是反思的,如果你有作用於用戶的輸入值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);
}
我所看到的處理(讀忌)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
}
}
很多時候,你可以重構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解釋得很好。
如果方法類型是字符串,它有多個參數..例如,字符串emilvalid(字符串x1,字符串x2)和字符串regExp(字符串錯誤)..都返回字符串..你能告訴我如何要做到這一點......以及使用什麼insted的行動..#行動只是無效的方法..和功能是返回的方法..但它仍然給錯誤.. – nikunjM