有没有办法获得类型的成员和所有后续基类型?

时间:2015-05-25 17:52:42

标签: roslyn

我有一个“ITypeSymbol”对象。如果我打电话给GetMembers,它会给我当前类型的成员,而不是基础成员。我知道我可以使用BaseType属性挖掘它,并有一些迭代代码来获取所有属性。

是否有更简单的方法来获取所有成员而不管继承层次结构中的级别?

1 个答案:

答案 0 :(得分:6)

如果您正在寻找所有成员,无论他们是否可以访问:

没有公共API可以做到这一点,而Roslyn团队的内部方法与您所描述的方法大致相同。

查看internal扩展方法GetBaseTypesAndThis()。您可以将其复制到您自己的扩展方法中,并按如下方式使用它:

var tree = CSharpSyntaxTree.ParseText(@"
public class A
{
    public void AMember()
    {
    }
}

public class B : A
{
    public void BMember()
    {
    }
}

public class C: B  //<- We will be analyzing this type.
{
    public void CMember()
    {
    }
    //Do you want this to hide B.BMember or not?
    new public void BMember()
    {
    }
}");

var Mscorlib = MetadataReference.CreateFromAssembly(typeof(object).Assembly);
var compilation = CSharpCompilation.Create("MyCompilation",
    syntaxTrees: new[] { tree }, references: new[] { Mscorlib });
var model = compilation.GetSemanticModel(tree);

var classC = tree.GetRoot().DescendantNodes().OfType<ClassDeclarationSyntax>().Last();
var typeC = (ITypeSymbol)model.GetDeclaredSymbol(classC);
//Get all members. Note that accessibility isn't considered.
var members = typeC.GetBaseTypesAndThis().SelectMany(n => n.GetMembers());

如果您正在寻找会员,并希望将辅助功能考虑在内:

看看GetAccessibleMembersInThisAndBaseTypes()

如果您尝试使用可访问类型的成员构建完成列表,请参阅Roslyn FAQ #5。示例代码为here

它使用SemanticModel.LookupSymbols()