我有一个` ITypeSymbol '对象.如果我调用GetMembers,它会给我当前类型的成员,而不是基础.我知道我可以使用BaseType属性挖掘它,并有一些迭代代码来获取所有属性.
有没有更简单的方法来获取所有成员而不管继承层次结构中的级别?
如果您正在寻找所有成员,无论他们是否可以访问:
没有公共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());
Run Code Online (Sandbox Code Playgroud)
如果您正在寻找会员并希望将可访问性考虑在内:
看看GetAccessibleMembersInThisAndBaseTypes()
.
如果您正在尝试使用可访问类型的成员构建完成列表,请参阅Roslyn FAQ#5.此处提供示例代码.
它用 SemanticModel.LookupSymbols()
归档时间: |
|
查看次数: |
886 次 |
最近记录: |