题
我使用 OWLGrinder 创建程序集并将库导入到我的项目中。效果很好。现在我想编写自己的一组类。因此我用相当于程序集的方式扩展了它们。但它就是行不通。
本体拥有一个名为 ManagementObject 的类。
我创建了另一个名为 RealWorldObject 的类 (C#):
public class RealWorldObject : ManagementObject { public RealWorldObject(string uri) : base(uri) { } public RealWorldObject(string uri, RdfDocument rdfdocument) : base(uri, rdfdocument) { } public RealWorldObject(RdfDocument rdfdocument) : base(rdfdocument) { } public String getClassName() { return this.OwlClassName; } public static RdfDocument addRealWorldObjectIndividualt(RdfDocument rdfDocument) { Vehicle vehicle = new Vehicle("vehicle1", rdfDocument); FixedEvent fxE1 = new FixedEvent("autoGekauft", rdfDocument); fxE1.agent = new xmlns.com.foaf._01.Person("robert", rdfDocument); vehicle.hasFixedEvent = fxE1; return rdfDocument; }
这会导致错误:
ObjectManagement.Object.RealWorldObject 确实声明了一个(且只有一个)OwlClassAttribute。这是插件的一个实现错误。
我还应该如何通过以下方式扩展生成的类 OWLGrinder
. 。谢谢,我很久以前就使用过 C#,所以我有点生疏了。
解决方案
OwlGrinder.exe 生成的自动生成的类在设计时并未考虑到继承。我并不是说它是错误的,它只是不是为此而设计的。自动生成的类包含大量定义为类属性的元数据,继承隐藏了所有这些。基础设施依赖于这些属性的存在,如果它们被隐藏,您会收到这些运行时错误消息。
使用 Visual Studio 对象浏览器查看自动生成的类的属性。OwlClassAttribute、SubClassOfAttribute、LightVersionAttribute 当然是必需的。您只需将 ManagementObject 的类属性复制/粘贴到 RealWorldObject 类的顶部即可。我想,它会起作用的。但同样,您可能会遇到其他障碍,因为您没有遵循 ROWLEX 设计的默认路线。这有点生活在边缘:)
您可以考虑使用 Reflector 或其他工具将自动生成的程序集逆向工程为 C#,而不是继承。有了源代码,您可以直接修改生成的类。您可以使 ManagementObject 类部分化,并在单独的文件中实现其他方法。