C# 为.NET对象编写脚本
我有一个简单的.NET应用程序,它作为Windows服务运行。 假设它有一个类C# 为.NET对象编写脚本,c#,.net,parsing,scripting,C#,.net,Parsing,Scripting,我有一个简单的.NET应用程序,它作为Windows服务运行。 假设它有一个类 MyClass { Run(Destination d) Walk(Destination d) Wash(Dishes d) } 我想创建一个控制台应用程序,在其中键入简单的人类可读命令 像 与windows控制台中的操作非常相似。我想知道实现这种映射的最佳方法是什么。一个简单的方法当然是用很多switch语句创建自己的字符串解析器,但我认为是否有更好更快的方法 也许PowerShell Comman
MyClass
{
Run(Destination d)
Walk(Destination d)
Wash(Dishes d)
}
我想创建一个控制台应用程序,在其中键入简单的人类可读命令
像
与windows控制台中的操作非常相似。我想知道实现这种映射的最佳方法是什么。一个简单的方法当然是用很多switch语句创建自己的字符串解析器,但我认为是否有更好更快的方法 也许PowerShell CommandLet是一个选项,尽管这会将您或您的用户限制到PowerShell(这是一个高级shell IMO)。这里有两个选项:
Run()
方法。您可以通过名称轻松找到所需的命令,然后运行它更新:Aggreed,有两个以上的选择(见Guffa的答案)。但是这两个是使代码更清晰的原因。不太清楚。还有其他的方法,但如果它们更好,主要是一个品味的问题,对于识别一个字符串,你不能比切换快很多 如果所有方法都具有相同的参数,则可以设置字符串和委托的字典。
例如:
var方法=新字典();
Add(“run”,n=>MyClass.run(n));
添加(“walk”,n=>MyClass.walk(n));
添加(“wash”,n=>MyClass.wash(n));
string cmd=“run”;
int参数=42;
if(methods.ContainsKey(cmd)){
方法[cmd](param);
}否则{
Console.WriteLine(‘说什么,人类?’);
}
这对于您的需求来说可能太多了,但我认为一种健壮、灵活的方法是创建两个元数据属性来装饰您可能希望从shell调用的类,例如:
[ScriptableClass]
public class MyClass
{
[ScriptableMethod(typeof (Destination),typeof(int))]
public void Run (Destination f, int distance) {}
}
然后,在shell启动过程中,通过反射加载程序集,并查找标有ScriptableClass属性的类型。对于它们中的每一个,您都可以检查它们的公共方法,查找那些标记有ScriptableMethod属性的方法,并且可以构建类及其可脚本化方法的字典(以及有关参数的信息)。对于上一个示例,您可以从shell中获得一个“MyClass.Run”命令。收到后,脚本引擎将创建/查找该类的实例并执行该方法
此方法的优点是,您不必每次添加新类或修改方法时都修改脚本引擎。+1,这是解决此问题的最佳解决方案。属性类和反射代码可能甚至不超过20行。
var methods = new Dictionary<string, Action<int>>();
methods.Add("run", n => MyClass.Run(n));
methods.Add("walk", n => MyClass.Walk(n));
methods.Add("wash", n => MyClass.Wash(n));
string cmd = "run";
int param = 42;
if (methods.ContainsKey(cmd)) {
methods[cmd](param);
} else {
Console.WriteLine('Say what, human?');
}
[ScriptableClass]
public class MyClass
{
[ScriptableMethod(typeof (Destination),typeof(int))]
public void Run (Destination f, int distance) {}
}