我在Visual Studio 2015中将AnTLR的插件用于C#。AnTLR具有一个类ParserRuleContext,所有解析器规则类都从该类继承。解析器规则类本身被声明为部分类,如下所示:

public partial class SomeRuleContext : ParserRuleContext {
    /* stuff goes here */
}


ParserRuleContext的定义如下所示:

public class ParserRuleContext : RuleContext
{
}


我正在为所有解析器规则实现自己的局部类,以使用解析器树进行自定义操作。我希望能够将一个属性添加到ParserRuleContext(以及稍后的其他属性/字段/方法),但是ParserRuleContext没有声明为partial。由于规则类都已经从另一个类继承,所以我不能使它们的部分实现也从一个类继承。扩展方法不能为我提供所有我想要的功能(无法添加属性/字段),而Interfaces确实可以将我完全相同的代码复制/粘贴到每个类中。作为软件开发人员,最后一部分几乎使我感到恶心。

我已经考虑过添加一个单一的,恒定的属性的想法,该属性指向一个包含所需功能的对象,但是该解决方案对我来说很笨拙,并为该类型的任何成员添加了额外的调用。所以这:

SomeRuleContextInstance.CustomProperty = new FileInfo( "path" );


变成这个:

SomeRuleContextInstance.CommonFunctionality.CustomProperty = new FileInfo( "path" );


我希望有一个更好的解决方案。

任何人都可以提供一种方法来修改ParserRuleContext基类,否则无法让我到处复制/粘贴代码?可以通过反射来完成吗?

最佳答案

您可以在具体上下文类和ParserRuleContext之间添加其他继承级别。

只需创建一个继承ParserRuleContext的类:

public abstract class MyParserRuleContext : ParserRuleContext
{
    // Whatever you want here
}


然后告诉您的语法使用以下选项:

grammar MyGrammar;

options {
     contextSuperClass = MyParserRuleContext;
}

// ...

关于c# - 没有继承的多个类中的相同代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41985994/

10-12 23:56