在. NET 8下运行.

IJoinable<T1, T2>已经作为通用接口存在于代码库中. 它声明了一个方法,T2 Join(T1 value). 用于类型参数(lTyperTypejoinedType)的类型是在运行时动态生成的TypeBuilder变量.

    var joinType = typeof(IJoinable<,>).MakeGenericType(rType, joinedType);
    lType.AddInterfaceImplementation(joinType);
    var joinMethod = lType.DefineMethod("Join", MethodAttributes.Public | MethodAttributes.Virtual, joinedType, [rType]);
    var gen = joinMethod.GetILGenerator();
    gen.Emit(OpCodes.Ldarg_0);
    gen.Emit(OpCodes.Ldarg_1);
    gen.Emit(OpCodes.Call, ctor);
    gen.Emit(OpCodes.Ret);
    lType.DefineMethodOverride(joinMethod, joinType.GetMethod("Join")!);

当我在最后一行调用joinType.GetMethod()时,它抛出了NotSupportedException,因为不知何故,它最终在System.Reflection.Emit.TypeBuilderInstantiation.GetMethodImpl()内部,而System.Reflection.Emit.TypeBuilderInstantiation.GetMethodImpl()的整个方法体就是抛出NotSupportedException.

如果这不起作用,那该怎么办?

推荐答案

为了执行涉及Reflection. Emit和泛型的操作,在TypeBuilder上有三个隐藏的静态方法:

  • TypeBuilder.GetMethod
  • TypeBuilder.GetConstructor
  • TypeBuilder.GetField

这些方法可用于TypeBuilderInstantiation个对象.因此,使用classic 的GetMethod方法失败的调用需要替换为类似的方法:

var genericMethod = TypeBuilder.GetMethod(joinType, typeof(IJoinable<,>).GetMethod("Join"));

事实上,我认为这些方法的文档是相当好的(TypeBuilder.GetMethod).但是,它们与Reflection. Emit API的其他部分建立的模式有所不同,因此很难找到它们.

Csharp相关问答推荐

VB.Net的SON模式导致集合代码不工作

.NET通过版本自动增量设置包版本

ASP.NET Core -是否可以对所有最小API端点应用过滤器?

在C#WinUI中,一个关于System的崩溃."由于未知原因导致执行不例外"

XUNIT是否使用测试数据的源生成器?

如何将不同类型的扩展参数的javascript函数转换成C#风格?

无法创建';';类型的';DbContext';.异常';无法解析类型';Microsoft.EntityFrameworkCore.DbContextOptions`1[Comm的服务

在具有不同属性名称的两个类之间创建关系

在.NET 8最低API中从表单绑定中排除属性

如何将FindAll()与Nuget包Interop.UIAutomationClient一起使用

如何在.NET AOT中为所有枚举启用JsonStringEnumConverter

Blazor Server.NET 8中的Blazore.FluentValidation问题

使用switch 类型模式时出现奇怪的编译器行为

Azure Functions v4中的Serilog控制台主题

多个选项卡上的MudForm验证

ASP.NET MVC数据批注验证组复选框

如何使用IHostedService添加数据种子方法

C#中使用ReadOnlySpan的泛型类型推理

在C#/ASP.NET Core 7中,什么可能导致POST请求作为GET请求发送

Excel将';@';添加到具有范围的公式中