gpt4 book ai didi

c# - 在 Visual Studio 2008 加载项中,如何判断类的属性实现了哪些接口(interface)?

转载 作者:行者123 更新时间:2023-11-30 22:46:26 25 4
gpt4 key购买 nike

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

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

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

谢谢。

最佳答案

是的。您必须确定该属性是类 (CodeClass) 还是接口(interface) (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
}
}

关于c# - 在 Visual Studio 2008 加载项中,如何判断类的属性实现了哪些接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2647683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com