В надстройке Visual Studio 2008 как узнать, какие интерфейсы реализует свойство класса? - PullRequest
2 голосов
/ 15 апреля 2010

В надстройке Visual Studio я перечисляю членов класса в текущем исходном файле. Когда я сталкиваюсь со свойством (например, CodeElement.Kind == vsCMElement.vsCMElementProperty), я преобразовываю этот CodeElement в CodeProperty, и я вижу имя и тип свойства.

У меня проблема с получением списка реализованных интерфейсов свойства. Мне интересно, если это потому, что реализованные интерфейсы могут быть в сборках, о которых Visual Studio «не знает».

Есть ли способ получить список интерфейсов, которые реализует свойство?

Спасибо.

1 Ответ

3 голосов
/ 15 апреля 2010

Да. Вам нужно будет определить, является ли свойство классом (CodeClass) или интерфейсом (CodeInterface). В любом случае вам нужно будет перебрать весь код (класс / интерфейс). Базы и рекурсивно проверить ImplementedInterfaces.

Вот пример примера кода (примечание: это просто, чтобы помочь с идеей)


        private void ProcessDocument()
        {
            CodeElements elements = _applicationObject.ActiveDocument.ProjectItem.FileCodeModel.CodeElements;
            foreach (CodeElement element in elements)
            {
                if (element.Kind == vsCMElement.vsCMElementNamespace)
                {

                    CodeNamespace ns = (CodeNamespace)element;
                    foreach (CodeElement elem in ns.Members)
                    {
                        if (elem is CodeClass)
                        {
                            CodeClass cls = elem as CodeClass;
                            foreach (CodeElement member in cls.Members)
                                if (member is CodeProperty)
                                {
                                    CodeType memberType = ((member as CodeProperty)).Type.CodeType;
                                    ProcessElem(memberType as CodeElement);
                                }
                        }
                    }
                }
            }
        }

        private void ProcessElem(CodeElement elem)
        {
            if (null == elem) return;
            // we only care about elements that are classes or interfaces.
            if (elem is CodeClass)
            {

                CodeClass cls = elem as CodeClass;
                CodeElements intfs = cls.ImplementedInterfaces;

                // do whatever with intfs
                // ...

                CodeElements bases = cls.Bases;
                foreach (CodeElement baseElem in bases)
                    ProcessElem(baseElem);
            } 
            else if (elem is CodeInterface)
            {
                // same as class, figure out all other interfaces this interface 
                // derives from if needed
            }
        }
...