[英]C# Command parser
我目前正在扩展我的知识,并想为自己创建一个小游戏。
结构如下:Programm.cs创建Gamecontroller的实例。 这个Gamecontroller是我要访问的最低级别。 它将从config之类的类中创建视图的实例。
我想用命令输入实现调试控制台。 这些命令应该始终从Gamecontroller级别开始,并且应该能够与我使用C#代码可以做的所有事情进行交互。
所以我想使用Gamecontroller或在任何嵌套对象中访问对象,成员和方法。
当前,我无法获得子级的属性,因为_member返回一个“类型”,该类型将解析为RuntimeProperty而不是Class
解析示例:
"objPlayer.name" > "GameController.objPlayer.name"
"objConfig.someSetting = 10" > "GameController.objConfig.someSetting=10"
"objConfig.functionCall()" > "GameController.objConfig.functionCall()"
"objConfig.objPlayer.setName("someName")" > "GameController.objConfig.objPlayer.setName("someName")"
"objPlayer.name" > "GameController.objPlayer.name"
这是我到目前为止所得到的:
private void parseComamnd(string Command)
{
var actions = Command.Split('.');
var start = this.GetType();
var last = actions[actions.Length - 1];
foreach (var action in actions)
{
if (action.Contains("(") && action.Contains(")"))
{
_exec(start, action);
}
else
{
start = _member(start, action);
}
}
}
private Type _member(Type pHandle, string pStrMember)
{
return pHandle.GetProperty(pStrMember).GetType();
}
private void _exec(Type pHandle, string pStrFunction)
{
var Regex = new Regex(@"\(|,|\)");
var FunctionParams = Regex.Split(pStrFunction);
var FunctionName = FunctionParams[0];
FunctionParams[0] = "";
FunctionParams = FunctionParams.Where(val => val != "").ToArray();
pHandle.GetMethod(FunctionName).Invoke(FunctionName, FunctionParams);
}
如果我理解正确,则希望将某些字符串命令与要执行的动作匹配。 在这种情况下,您可以使用字典作为字符串代表配对的存储,以将字符串命令与要执行的操作进行匹配。 作为这种方法的优势,您可以根据需要在程序运行时更改匹配的对
class SomeClass
{
delegate void OperationDelegate(string value);
IDictionary<string, OperationDelegate> Operations = new Dictionary<string, OperationDelegate>();
public SomeClass()
{
Operations.Add("objPlayer.name", SetName);
Operations.Add("objConfig.someSetting", SetSetting);
}
public void HandleNewValue(string command, string value)
{
try
{
if (Operations.ContainsKey(command))
Operations[command](value);
}
catch (Exception e)
{
Logger.Error(e);
}
}
private void SetName(string value)
{
// Some logic there
}
private void SetSetting(string value)
{
// Some logic there
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.