这就是我想要的:
static void A(string s)
{
//Code Here...
}
static void B(string s)
{
//Code Here...
}
static void C(string s)
{
//Code Here...
}
static void Main(string[] args)
{
string temp = Console.ReadLine();
string[] s = temp.Split(' ');
if (s[0] == "A")
A(s[1]);
if (s[0] == "B")
B(s[1]);
if (s[0] == "C")
C(s[1]);
}
但是当我有很多方法时,它的效果并不好......
还有其他办法吗?
答案 0 :(得分:1)
有时您可以使用Dictionary
Actions
将字符串映射到方法:
using System;
using System.Collections.Generic;
namespace Demo
{
internal class Program
{
private static void Main(string[] args)
{
_actions = new Dictionary<string, Action<string>>();
_actions["A"] = A;
_actions["B"] = B;
_actions["C"] = C;
string[] s = Console.ReadLine().Split(' ');
if (!processArg(s[0], s[1]))
{
// Argument wasn't in the list. Do error handling.
}
}
static bool processArg(string name, string value)
{
Action<string> action;
if (_actions.TryGetValue(name, out action))
{
action(value);
return true;
}
return false;
}
static void A(string s)
{
Console.WriteLine("A: " + s);
}
static void B(string s)
{
Console.WriteLine("B: " + s);
}
static void C(string s)
{
Console.WriteLine("C: " + s);
}
private static Dictionary<string, Action<string>> _actions;
}
}
答案 1 :(得分:1)
你可以写这样的东西。
private static void Main(string[] args)
{
InitializeFunctions();
string temp = Console.ReadLine();
string[] s = temp.Split(' ');
_functions[s[0]].Invoke(s[1]);
}
private static void InitializeFunctions()
{
_functions.Add("A",A);
_functions.Add("B",B);
_functions.Add("C",C);
}
private static Dictionary<string, Func> _functions = new Dictionary<string, Func>();
public delegate void Func(string process);
static void A(string s)
{
//Code Here...
}
static void B(string s)
{
//Code Here...
}
static void C(string s)
{
//Code Here...
}
如果您将使用相同签名的新方法,只需将其添加到InitializeFunctions方法中的_functions字典。
答案 2 :(得分:0)
你想要使用的是这样的。
typedef void (*FuncType)();
std::map<char, FuncType> Fonctions;
Fonctions['A'] = &FonctionA;
...
Fonctions['Z'] = &FonctionZ;
Fonctions[s[0]](s[1]);
您还必须检查Function[s[0]]
是否已定义。
答案 3 :(得分:0)
如果没有您尝试做的更多细节,一个基本的替代方案可能是使用一种方法并使用switch语句。
static void PerformAction(string method, string cInput)
{
switch(method)
{
case "A":
//code
//something with cInput
break;
case "B":
//code
break;
//..
default:
//default action code
}
}
并像这样称呼它
string temp = Console.ReadLine();
string[] s = temp.Split(' ');
PerformAction(s[0],s[1]);
答案 4 :(得分:0)
我有两种方法来处理这个特殊问题:
切换声明
在这种情况下,您将组织如下代码:
switch (s[0])
{
case "A":
A(s(1));
break;
case "B":
B(s(1));
break;
// and so on
}
**使用反射**
如果要按名称调用方法,从字符串中获取名称,则必须使用反射:
MethodInfo method = typeof(Program).GetMethod(s(0)); // guessing "Program" here
if (method != null)
method.Invoke(null, new object[] { s(1) });
但是,我会不使用来自用户的输入执行此操作,这就像SQL注入攻击一样,只会更糟。
答案 5 :(得分:0)
试试这个:
static void A(string s)
{
//Code Here...
}
static void B(string s)
{
//Code Here...
}
static void C(string s)
{
//Code Here...
}
public struct ActionStruct {
public string String;
public Action<string> Action;
public ActionStruct(string s, Action<string> a) : this() {
String = s; Action = a;
}
}
void Main(string[] args) {
var actions = new List<ActionStruct>() {
new ActionStruct("A", s => A(s)),
new ActionStruct("B", s => B(s)),
new ActionStruct("C", s => C(s))
};
var action = actions.Where(a=>a.String == args[0]).FirstOrDefault();
if (action.String!= "") action.Action(args[1]);
}
答案 6 :(得分:0)
此代码适用于所有方法,可能是您的输入不正确或者您想要执行多种方法。
例如:
如果您从控制台读取以下行,那么
A Abcdefg
分裂之后[0]将是&#34; A&#34;并且s [1]将是&#34; Abcdefg&#34;,
如果您从控制台读取以下行,那么
A abcdef B bhfhhhfh C chgghh
分割s[0]= "A", s[1]="abcdef " s[2]= "B", s[3]="bhfhhhfh " s[4]= "C", s[5]="chgghh"
后
在这种情况下,只会调用A(String),因为你只检查s [0]和s [1]
如果要调用所有方法,请在循环中执行它
for(int i=0;i<s.length;i=i+2){
if (s[i] == "A")
A(s[i+1]);
if (s[i] == "B")
B(s[i+1]);
if (s[i] == "C")
C(s[i+1]);
}
修改强> 如果你不想写,那么你可以使用开关
开关(s [0]) { 案例&#34; A&#34;: A(S(1)); 打破; 案例&#34; B&#34;: B(S(1)); 打破; 案例&#34; C&#34;: C(S(1)); 打破; 。 。 。 。 。
}