我有一个`I类型符号' 目的。如果我打电话获取会员,它给我当前类型的成员,而不是基类。我知道我可以使用 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());
以下是对的定义GetBaseTypesAndThis()
public static IEnumerable<ITypeSymbol> GetBaseTypesAndThis(this ITypeSymbol type)
{
var current = type;
while (current != null)
{
yield return current;
current = current.BaseType;
}
}
要检查可访问性,请在以下行中放置一个 where 条件来检查可访问性:
typeC.GetBaseTypesAndThis().SelectMany(n => n.GetMembers().Where(x => x.DeclaredAccessibility == Accessibility.Public));`
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)