我正在尝试使用 System.Reflection.Emit 编写 .NET 编译器,如何进行类型解析?

2024-02-08

我有一个从引用的 dll 解析类型的策略。我一直在尝试解析正在编译的程序集中定义的类型。我使用的是 System.Reflection.Emit api,没有第三方库。

例如:

class A {}
class B
{
    public A AnInstanceOfA {get; private set;}
}

解决 B 对 A 的引用的最佳方法是什么?

那这个呢:

class A
{
    B AnInstanceOfB {get; set;}
}
class B
{
    A AnInstanceOfA {get; set;}
}

其中类包含彼此的实例。

有没有最佳实践方法可以做到这一点?我应该实施什么设计模式?我更愿意仅使用 System.Reflection.Emit 库,但如果有更好的方法来执行此操作或无法使用它们来完成此操作,那么使用其他库是可以接受的。

Thanks


您能否详细说明您遇到的问题(也许向代码显示一个不适合您的代码的小示例)?因为TypeBuilder源自于Type,如果您尝试定义相互递归类型,您可以传递两个TypeBuilders 任何您想要引用类型的地方。

EDIT

无需“解析”类型。您可以访问TypeBuilders 对于每个并且可以使用它们就像它们是完全定义的类型一样。以下是生成您在更新中请求的代码的示例:

private void DefineAutoProp(string name, Type t, TypeBuilder tb)
{
    var fldName = name.Substring(0, 1).ToLower() + name.Substring(1);
    var fld = tb.DefineField(fldName, t, FieldAttributes.Private);
    var prop = tb.DefineProperty(name, PropertyAttributes.None, t, null);
    var getter = tb.DefineMethod("get_" + name, MethodAttributes.Public, t, null);
    var ilg = getter.GetILGenerator();
    ilg.Emit(OpCodes.Ldarg_0);
    ilg.Emit(OpCodes.Ldfld, fld);
    ilg.Emit(OpCodes.Ret);
    var setter = tb.DefineMethod("set_" + name, MethodAttributes.Public, typeof(void), new[] { t });
    ilg = setter.GetILGenerator();
    ilg.Emit(OpCodes.Ldarg_0);
    ilg.Emit(OpCodes.Ldarg_1);
    ilg.Emit(OpCodes.Stfld, fld);
    ilg.Emit(OpCodes.Ret);
    prop.SetGetMethod(getter);
    prop.SetSetMethod(setter);
}

public void DefineTypes()
{
    var ab = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("test"), AssemblyBuilderAccess.Run);
    var mb = ab.DefineDynamicModule("test");
    var A = mb.DefineType("A", TypeAttributes.Public | TypeAttributes.Class);
    var B = mb.DefineType("B", TypeAttributes.Public | TypeAttributes.Class);
    DefineAutoProp("AnInstanceOfA", A, B);
    DefineAutoProp("AnInstanceOfB", B, A);
    A.CreateType();
    B.CreateType();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我正在尝试使用 System.Reflection.Emit 编写 .NET 编译器,如何进行类型解析? 的相关文章

随机推荐

  • Inno Setup:如何处理[UninstallDelete]部分的进度条?

    我使用 Inno Setup 为我的应用程序制作安装程序 当用户卸载应用程序时 我想删除其中的自定义文件夹Program Data文件夹 我的文件夹很大 大约15 GB 所以我使用 UninstallDelete 删除此文件夹的部分 Uni
  • 用于搜索引擎风格搜索的 JavaScript 库? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有一个 JavaScript 库可以确定字符串是否与搜索查询匹配 它应该高效并提供高级查询功能 如
  • 在 JSDoc 中记录开放式参数函数的正确方法

    假设您有如下内容 var someFunc function do something here with arguments 您如何正确记录该函数可以在 JSDoc 中接受任意数量的参数 这是我最好的猜测 但我不确定它是否正确 param
  • 当overflow-x:hidden存在时,overflow-y:visible不起作用[重复]

    这个问题在这里已经有答案了 在 Chrome 或 Firefox 中无法正常工作 有什么解决方法吗 h3 overflow y visible h3 with overflow x hidden div style width 100px
  • 在 PDO 准备好的语句中将值传递给 MySQL IN 操作?

    我有一个表单字段 它返回一个逗号分隔的字符串 我想将其传递给 PHP PDO MySQL 查询 IN 操作 但 IN 操作要求值以逗号分隔 而不是我的string的分隔值 我该怎么做呢 values POST values 10 5 4 3
  • 加特林 websocket 场景中的状态检查

    我有一个加特林场景 我订阅了一个 websocket 并想要检查传入消息的内部一致性 例如 通过 websocket 发送的消息是
  • Joomla 介绍图片作为阅读更多链接

    我想让 joomla 文章介绍图像的行为类似于阅读更多内容和标题链接 因此 用户单击图像 然后加载文章 我不是 PHP 专家 但也许这是阅读更多链接代码 a href class a
  • Google 地图显示“仅用于开发目的”

    当我尝试在网页中显示它时 Google 地图显示消息 仅用于开发目的 我怎样才能让这条消息消失呢 我的代码是这样的
  • 当所有测试在测试项目中运行时管理 Application.Current

    问题介绍 该网站上有几个关于应用 当前当测试的方法 函数包含 Dispatcher 使用时 为 null 问题 第一次我只使用了一个简单的解决方案 我刚刚创建了一个 getter 属性来创建一个new Application 以防止 应用
  • 在 C# 中创建列表的列表

    我似乎在理解 C 中通用列表的通用列表的想法时遇到了一些麻烦 我认为问题源于使用
  • 在 Java 中将 Element(org.w3c.dom) 转换为字符串

    我在将 Element 对象转换为 String 时遇到一个小问题 因为我需要将一个字符串传递给特定的方法 我尝试过使用 toString 或使用分配给它的字符串变量 没有一项试验是正确的 我们怎样才能轻松地进行转换 并且字符串对象还应该显
  • 阻止特定 DIV 的 UI Jquery 插件

    任何人都知道 BlockUI 的 JQuery 插件 它允许阻止特定的 DIV 而不仅仅是整个页面 谢谢 你可以通过blockui http jquery malsup com block element plugin
  • 像素完美的 Android 碰撞检测

    好的 我正在 Android 上开发一款游戏 我需要实现像素完美的碰撞检测 我已经在每个图像周围设置了边界框 每个边界框都经过变换以匹配图像的当前旋转 这一切都很好 我还将每个位图的像素数据存储在数组中 有人可以帮我找出检测像素是否重叠的最
  • 让 CC-Tray 工作

    我正在尝试让 cc tray 工作 而不是使用网络仪表板 我不确定如何获得运行 Cruisecontrol 的服务器的正确 URL 并且在网上找不到任何有用的文档 有人可以帮忙吗 Thanks 我遇到了同样的问题 并解决了在添加服务器 ht
  • “未在此范围内声明”错误

    所以我正在编写这个简单的程序来使用发现的高斯算法来计算任何日期的日期here http en wikipedia org wiki Determination of the day of the week Gaussian algorith
  • Redis 对二级索引的支持

    redis是否支持字符串数据类型的二级索引 我已经安装了 redis 服务器来检查这一点 但无法清楚地找到执行此操作的方法 我想知道如何将数据与辅助密钥一起存储在 Redis 中 例如 假设我想存储车辆 ID 注册号 在我的情况下 这将是主
  • 直接应用 numpy 梯度结果与使用 xarray.apply_ufunc 应用的结果之间的差异

    我正在尝试使用 xarray 的apply ufunc包装 numpy 的gradient函数 以便沿一维获取梯度 然而 apply ufunc返回一个与使用的数组形状不同的数组np gradient直接返回 import xarray a
  • C 中构造函数和析构函数的命名约定 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 不要在管理中通过电子邮件 opencart 2.3.0.2 向客户发送电子邮件

    我想为客户电子邮件发送电子邮件 但显示消息成功 但不为 yahoo 或 gmail 发送电子邮件 我的开放式购物车是2 3 0 2 安全 SSL TLS 设置 推荐 Username email protected cdn cgi l em
  • 我正在尝试使用 System.Reflection.Emit 编写 .NET 编译器,如何进行类型解析?

    我有一个从引用的 dll 解析类型的策略 我一直在尝试解析正在编译的程序集中定义的类型 我使用的是 System Reflection Emit api 没有第三方库 例如 class A class B public A AnInstan