2012-02-24 57 views
0

我使用OWLGrinder來創建程序集並將庫導入到我的項目中。這工作正常。現在我想寫我自己的一套類。因此,我將這些擴展到了程序集的相當部分。但它不起作用。使用生成的.net類來擴展自己的類。如何?

本體擁有一個名爲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 does declare one (and only one) OwlClassAttribute. This is an implementation bug of the plugin.

怎麼回事應該由我OWLGrinder擴展生成的類。我很久以前用C#,所以我有點生疏。

+0

構造函數覆蓋沒有任何用處! – Bas 2012-02-24 19:57:54

+0

我知道,它應該沒有工作。但如果我這樣做: Realworldobject rw = new RealworldObject(「bla」); 我得到一個錯誤,沒有支持1參數的構造函數! – robert 2012-02-26 10:35:41

回答

0

由OwlGrinder.exe生成的自動生成的類不是爲了繼承而設計的。我並不是說這是錯誤的,它並不是爲此而設計的。自動生成的類包含許多定義爲類屬性的元數據,並且繼承隱藏了所有這些。基礎架構會考慮這些屬性的存在,如果它們隱藏,則會得到這些運行時錯誤消息。

使用Visual Studio對象瀏覽器,查看自動生成的類上的屬性。 OwlClassAttribute,SubClassOfAttribute,LightVersionAttribute當然是強制性的。您可以簡單地將ManagementObject的類屬性複製/粘貼到RealWorldObject類的頂部。我認爲,它會起作用。但是,您可能會遇到更多的顯示屏塞,因爲您不遵循ROWLEX設計的默認路線。這是有點生活在邊緣:)

而不是繼承,你可能會考慮使用反射器或其他工具逆向工程自動生成的程序集到C#。把源代碼放在手中,你可以直接修改生成的類。您可以將ManagementObject類設爲部分,並在另外的文件中實現其他方法。

+0

謝謝。這給了我一個明確的立場。 – robert 2012-02-29 10:49:57

相關問題