我目前正在扩展我的知识,并希望为自己创建一个小游戏。
结构如下: Programm.cs创建了一个Gamecontroller实例。这个Gamecontroller是我想访问的最低级别。它将创建视图的实例,以及来自config等的类。
我想用命令输入实现调试控制台。这些命令应始终从Gamecontroller级别开始,并且应该能够与C#代码进行交互。
所以我想使用Gamecontroller或任何嵌套对象访问Objects,Member和方法。
目前我无法访问孩子的属性,因为_member返回一个" Type"它被解析为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);
}
答案 0 :(得分:0)
如果我理解正确,您希望将一些字符串命令与您要执行的操作相匹配。在这种情况下,您可以使用Dictionary作为string-delgate couple的存储,以将您的字符串命令与您想要执行的操作相匹配。作为此方法的一个优点,您可以根据需要在程序运行时更改匹配的伴随
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
}
}