gpt4 book ai didi

c# - IL Emit TypeBuilder 和解析引用

转载 作者:行者123 更新时间:2023-11-30 18:41:26 25 4
gpt4 key购买 nike

我发出了几个类,其中一些需要在自己的构造函数中构造它们的对等体。不存在无限递归依赖(因此如果 A 构造 B,B 将不会构造 A;这对于嵌套引用也是如此 [A 构造 B 构造 C 意味着 B 和 C 都不会构造 A])。我目前正在处理发出构造函数的代码,但遇到了一些问题。我不知道预先依赖项的顺序,所以我似乎有几个选择:

  1. 以某种方式按它们的依赖关系对类进行排序,并按照它们的依赖关系的顺序“构建”它们,因此更多的依赖类有一个有效的构造函数引用可供获取。
  2. 在第一遍中分别定义所有构造函数(实际上不为方法发出 IL),以便定义所有构造函数引用。
  3. 以某种方式缓存已定义的构造函数,这样如果尚未定义构造函数,我可以创建一个占位符 ConstructorBuilder 来获取引用,然后在最终发出构造函数时获取引用。

我目前正在尝试选项 (3),我想知道是否已经有一种方法可以从 TypeBuilder 执行此操作。我的代码看起来像这样(在需要时获取构造函数引用):

            var fieldType = DefineType(udtField.Type); // This looks up a cached TypeBuilder or creates a placeholder, if needed
var constructor = fieldType.GetConstructor(Type.EmptyTypes);
if (constructor == null)
{
constructor =
fieldType.DefineConstructor(
MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName,
CallingConventions.Standard, Type.EmptyTypes);
}

我的 Build 方法目前是这样开始的(我认为如果之前定义了构造函数,这将不起作用):

    private void BuildConstructor()
{
var method =
DefinedType.DefineConstructor(
MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName,
CallingConventions.Standard, Type.EmptyTypes);
var il = method.GetILGenerator();

有什么方法可以查找以前定义的 ConstructorBuilder(如果已经定义),而不必创建我自己的显式缓存?似乎 TypeBuilder 应该知道它,但我看不到任何明显的方法可以从 TypeBuilder 文档中查找它。


编辑:

我最终沿着路线 (2) 走下去,它在第一遍中定义了所有相关方法,然后在第二遍中发出 IL。我仍然很好奇是否有可能从 TypeBuilder 中为已经在别处定义的构建器获取 MethodBuilder 实例(或 ConstructorBuilder 实例)。

最佳答案

我不是 TypeBuilder 方面的专家,但它有一个方法 .GetConstructor ( http://msdn.microsoft.com/en-us/library/cs01xzbk.aspx ) 和 .GetMethod ( http://msdn.microsoft.com/en-us/library/4s2kzbw8.aspx )如果您在缓存的 fieldType 上调用它们,它应该能够返回声明的构造函数...

关于c# - IL Emit TypeBuilder 和解析引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6831859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com