我在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/