在Visual Studio 2008外接程序中,如何判断类属性实现的接口?

时间:2010-04-15 17:42:05

标签: c# visual-studio-2008 vsx visual-studio-addins

在Visual Studio加载项中,我正在枚举当前源文件中类的成员。当我遇到一个属性(例如CodeElement.Kind == vsCMElement.vsCMElementProperty)时,我将CodeElement转换为CodeProperty,我可以看到属性的名称和类型。

我遇到的问题是获取属性实现的接口列表。我想知道这是否是因为实现的接口可能在Visual Studio不“知道”的程序集中。

有没有办法获取属性实现的接口列表?

感谢。

1 个答案:

答案 0 :(得分:3)

是。您必须确定该属性是Class(CodeClass)还是Interface(CodeInterface)。在任何一种情况下,您都需要遍历所有代码(类/接口).Bases并递归检查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
            }
        }