2012-02-24 40 views

回答

0

ROWLEX不是推理者。它具有實現推理器的一些功能 - 對於C#類的生成非常必要 - 但其API不是爲此設計的。但是,仍然有希望,而不是最優雅的解決方案。

我假設你有一個本體論,並且你使用OwlGrinder.exe生成了.NET類。因此,默認情況下,爲本體中的每個對應的OWL類生成兩個關聯的.NET類:一個輕類和一個完整類。我們只打算使用light類。我們只是遍歷所有的.NET類,並過濾掉是否是子類。這就對了。

string baseClassUri = "http://myontology/2012/10#mybaseclass"; 
Assembly asm = GetMyAssemblyGeneratedByOwlGrinder(); 

Type[] subClasses = (from type in asm.GetTypes() 
        where type.IsSubclassOf(typeof(NC3A.SI.Rowlex.OwlThing)) 
        // selecting subclasses only 
        let attributes = type.GetCustomAttributes(typeof(NC3A.SI.Rowlex.SubClassOfAttribute), false) 
        from attr in attributes 
        let subClassAttr = attr as NC3A.SI.Rowlex.SubClassOfAttribute 
        where subClassAttr.TypeUri == baseClassUri 
        // selecting light classes only 
        let lightAttributes = type.GetCustomAttributes(typeof(NC3A.SI.Rowlex.LightVersionAttribute), false) 
        from lightAttr in lightAttributes 
        let lightAttr_ = lightAttr as NC3A.SI.Rowlex.LightVersionAttribute 
        where lightAttr_.LightVersion == true 
        select type).ToArray(); 

我沒有嘗試代碼,它可能是越野車。但它確實表明了這個想法。每個生成的類都添加了一堆屬性。這些包括它們在SubClassOfAttribute中的基類,以及它們是使用LightVersionAttribute的輕類還是完整類。您可以根據這些屬性篩選出您感興趣的類。