2012-02-24 3 views

ответ

0

ROWLEX не является аргументом. В нем реализована некоторая функциональность разумного пользователя - это очень необходимо для генерации класса C#, но его API не предназначен для этого. Тем не менее, есть еще надежда, а не самое элегантное решение.

Я предполагаю, что у вас есть онтология, и вы создали .NET-классы из этого, используя OwlGrinder.exe. Поэтому по умолчанию у вас есть два связанных класса .NET, сгенерированных для каждого соответствующего класса OWL в онтологии: один класс света и один полный класс. Мы будем использовать только легкие классы. Мы просто перебираем все классы .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. Вы можете отфильтровать интересующие вас классы на основе этих атрибутов.