【问题标题】:Within a Visual Studio 2008 Add-In, how can I tell which interfaces a class' property implements?在 Visual Studio 2008 加载项中,我如何知道类的属性实现了哪些接口?
【发布时间】:2010-04-15 17:42:04
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

    是的。您必须确定该属性是类 (CodeClass) 还是接口 (CodeInterface)。无论哪种情况,您都需要遍历所有 Code(Class/Interface).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
                }
            }
    

    【讨论】:

    • 感谢您的回复。我试图为其实现接口的元素是一个属性(例如 CodeElement.Kind == vsCMElement.vsCMElementProperty),所以我认为我没有 CodeClass。你知道如何从 CodeElement 对象中获取 CodeClass 对象吗?
    • 更新了一个更全面的例子。
    猜你喜欢
    • 2010-10-31
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    相关资源
    最近更新 更多