我正在用自己的函数编写一个非常简单的脚本编写工具。
我可以使用和不使用参数来调用方法。我的主要问题是解析用户输入的参数。 我是否需要自己核心解析器或者有更好的方法吗?
示例代码
public class FunctionList
{
public void MyMethod(string x)
{
MessageBox.Show(x);
}
}
public void Test()
{
Type type = typeof(FunctionList);
MethodInfo method = type.GetMethod(debugBox.Text);
FunctionList c = new FunctionList();
method.Invoke(c, new object[] { "lorem ipsum" });
}
TextBox中的用户输入示例:
MyMethod(Hello World)
Sleep(500)
MyMethod(Waited 500 ms)
Sum(5, 4)
我还想添加条件和循环,但我认为除了调用方法之外还需要其他东西。
我想出的解析器示例:
public void Test()
{
Type type = typeof(FunctionList);
MethodInfo method = type.GetMethod(helper.GetUntilOrEmpty(debugBox.Text, "(")); //gets all text until first ( which translates to the function name
FunctionList c = new FunctionList();
//Handles one argument, gets the text between ( )
int pFrom = debugBox.Text.IndexOf("(") + "(".Length;
int pTo = debugBox.Text.LastIndexOf(")");
string result = debugBox.Text.Substring(pFrom, pTo - pFrom);
//pass params
method.Invoke(c, new object[] { result });
}
答案 0 :(得分:0)
我在处理这些场景方面有很多经验。我开发了自己的脚本引擎(早在Adobe Flash黄金时代)。
如果你有一个复杂的机制来创建函数和对象,我建议你编写一个解析器,将你的自定义脚本代码转换为C#的编译时无错误代码。
我已经测试了你的代码,如果你已经知道要通过哪个参数,它就能正常工作。
public void Test()
{
Type type = typeof(FunctionList);
MethodInfo method = type.GetMethod("MyMethod");
FunctionList c = new FunctionList();
// if you dont know the type of parameter passed then you have to write a parser to determine the type of the parameter right before executing the method.
method.Invoke(c, new object[] { "lorem ipsum" , 10});
}
}
public class FunctionList
{
public void MyMethod(string x, int y)
{
MessageBox.Show(x + " : " + y);
}
}