Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为.NET对象编写脚本_C#_.net_Parsing_Scripting - Fatal编程技术网

C# 为.NET对象编写脚本

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

我有一个简单的.NET应用程序,它作为Windows服务运行。 假设它有一个类

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) {}
    }