【问题标题】:Scripting .NET objects编写 .NET 对象脚本
【发布时间】:2010-12-14 23:09:40
【问题描述】:

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

MyClass
{
  Run(Destination d)
  Walk(Destination d)
  Wash(Dishes d)
}

我想创建一个控制台应用程序,我可以在其中键入简单的人类可读命令 喜欢

run left
walk right

与您在 Windows 控制台中所做的非常相似。我想知道实现此映射的最佳方法是什么。直接的方法当然是使用大量 switch 语句创建自己的字符串解析器,但我认为是否有更好更快的方法。

【问题讨论】:

    标签: c# .net parsing scripting


    【解决方案1】:

    不是真的。还有其他方法,但如果它们更好,主要是个人喜好问题,而且要识别字符串,你不能比 switch 快得多。

    如果所有方法都具有相同的参数,您可以设置字符串和委托的字典。
    示例:

    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?');
    }
    

    【讨论】:

      【解决方案2】:

      这可能无法满足您的需求,但我认为一种强大、灵活的方法是创建几个元数据属性来装饰您可能希望从 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 行左右。
      【解决方案3】:

      你有两个选择:

      1. 使用反射找到具有适当名称的类方法并调用它。

      2. 使用the command pattern,其中每个命令对象都有一个名称和一个Run() 方法。您可以通过名称轻松找到所需的命令,然后运行它。

      更新:同意,有两个以上的选择(请参阅 Guffa 的回答)。但是这两个是使代码更清晰恕我直言。

      【讨论】:

        【解决方案4】:

        也许 PowerShell CommandLet 将是一个选项,尽管这会将您或您的用户限制在 PowerShell(这是一种高级 shell IMO)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-08-05
          • 2012-08-02
          • 2023-04-03
          • 1970-01-01
          • 1970-01-01
          • 2011-06-04
          • 1970-01-01
          相关资源
          最近更新 更多