有没有办法获取某个类型的成员以及所有后续的基本类型?

2023-11-27

我有一个`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(使用前将#替换为@)

有没有办法获取某个类型的成员以及所有后续的基本类型? 的相关文章

随机推荐

  • 当我们将多维数组传递给函数时,为什么可以省略它的第一维

    当我们将多维数组传递给函数时 为什么可以省略多维数组的第一维 在我的编程课上 我们被告知在将多维数组传递给函数时我们可以省略第一维 例如 a 10 15 20 可以传递为a 15 20 Why 因为数组将衰减为指针并计算数组元素的偏移量 所
  • 如果值在范围内,则合并 2 个数据帧

    我已经为此苦苦挣扎了一段时间 找不到任何方法 所以如果您能提供帮助 我将非常感激 我是编程新手 我的代码可能效率低下 但这是我能想到的最好的 基本上 我有 2 个 csv 文件 fixes csv 和zones csv 它们包含不同的变量并
  • 具有 ContainsTable 的多列和带有全文索引的布尔逻辑

    我有一个非常基本的场景 但我所读到的内容听起来使用 SQL Server 全文目录和索引并不容易 我有两列 名字和姓氏 我想支持对他们的全文搜索 这样如果有人输入 John Smith 则匹配的人both第一个和最后一个首先出现 虽然创建跨
  • 支持传播的 Spring 事务

    我想了解 Spring 事务与传播支持的用途 java 文档提到 如果该方法具有 Transactional propagation Propagation SUPPORTS 从事务内部调用它支持事务 但如果不存在事务 则该方法将以非事务方
  • 使用 DefaultHTTPClient 时如何显示所有 HTTP 标头?

    当使用DefaultHttpClient 从 Apache Commons HTTP 客户端 是否可以在控制台输出中显示完整的请求以进行调试 我的应用程序遇到问题 我觉得调试它的最简单方法是检查由应用程序发送的所有数据DefaultHTTP
  • PostgreSQL 的 random() 函数的质量如何?

    假设我正在创建一个表foo有一个柱子bar这应该是一个非常大的随机整数 CREATE TABLE foo bar bigint DEFAULT round 9223372036854775807 bigint double precisio
  • 如何在Sqlite中删除表与其他表的内连接?

    我的查询 DELETE a FROM TR ContactResultRecord a INNER JOIN TR Case b on a FireStationCode b FireStationCode and a CaseNo b C
  • DocumentFragment 浏览器支持

    今天我偶然发现了 createDocumentFragment 我想知道 DocumentFragment 是否受支持 以及如何在不同的浏览器上支持 特别是 IE 系列 有人知道关于这个主题的任何事情吗 是的 所有现代浏览器 包括 IE6
  • 在 ColdFusion 中使用带命名参数的冒号

    我在录音中看到了这个代码示例 想知道冒号语法的作用 我搜索了文档 但找不到任何相关信息 weather subscribe observer application observers currentConditions 我知道我们可以在
  • 如何在网站中嵌入 LIVE Colab Notebook?

    我想建立一个网站并将其部署到github页面或heroku 我的问题是 是否可以在我将托管的网站中嵌入 LIVE 我可以运行代码 Google Colab 笔记本 我想要这个嵌入式 Colab 笔记本来执行 Spark 代码 Thanks
  • 执行 jenkins sh 管道步骤时权限被拒绝

    我对这种情况有一些麻烦 每次我创建一个新的管道作业 标题为 管道 时 sh即使使用像这样的简单命令 步骤也不起作用ls or pwd它返回此日志 sh 1 var jenkins home workspace pipeline tmp du
  • Java EE 6 CDI 实现之间的差异

    我查看了 JBoss 的 JSR 299 上下文和依赖注入的 Weld 参考实现 我想知道其他 CDI 实现之间的比较 具体来说 我了解 Weld Resin CanDI 由 Caucho 开发 和 Apache OpenWebBeans
  • SQLite 连接未出现在实体数据模型向导中

    我做了什么才到达现在的位置 我安装了该程序集http system data sqlite org index html doc trunk www downloads wiki使用 GAC 和 VS2012 选项 我现在可以连接到现有的
  • 如何封送可变大小的结构数组? C# 和 C++ 互操作帮助

    我有以下 C 结构 struct InnerStruct int A int B struct OuterStruct int numberStructs InnerStruct innerStructs 和一个 C 函数 OuterStr
  • BLAS 中矩阵之间的元素明智乘法?

    我开始在 C 特别是 Intel MKL 中使用 BLAS 函数来创建一些旧 Matlab 代码的更快版本 到目前为止 它运行良好 但我不知道如何对 2 个矩阵 Matlab 中的 A B 执行元素乘法 我知道 gemv 在矩阵和向量之间做
  • 取消所有AsyncTask?

    我有一个用于获取媒体文件拇指的类 这个类似 Loader 的类启动了一个AsyncTask对于每一个ImageView 被称为SomeAdapter getView 任务本身做了很多事情 其中 之一就是调用DiskLruCache 但是当卸
  • 用于检测数据集中太大而无法完全加载到内存中的重复项的算法

    这个问题有最优解吗 描述一种在包含一百万个电话号码的文件中查找重复项的算法 该算法在运行时只有两兆字节的可用内存 这意味着您无法一次将所有电话号码加载到内存中 我的 天真的 解决方案是一个 O n 2 解决方案 它迭代这些值并只加载文件块而
  • 将 log4j.properties 转换为 log4j.xml 的脚本

    我需要使用自定义过滤器 因此我需要将一些长 log4j properties 文件转换为 log4j xml 有人知道有一种工具可以做到这一点 或者愿意贡献一个他们使用过的工具吗 到目前为止 搜索还没有找到这样的工具 我也需要这样做 但找不
  • 使用 AAR 和源 JAR 将 Android 库发布到 Maven

    有人可以给我一个关于如何使用的提示吗maven publishGradle 插件发布com android library带有 AAR 和源 jar 的项目 模块 我可以用旧的来做到这一点maven插件 但我想使用新的maven publi
  • 有没有办法获取某个类型的成员以及所有后续的基本类型?

    我有一个 I类型符号 目的 如果我打电话获取会员 它给我当前类型的成员 而不是基类 我知道我可以使用 BaseType 属性来挖掘它 并使用一些迭代代码来获取所有属性 有没有更简单的方法来获取所有成员 无论继承层次结构的级别如何 如果您正在