小编Cod*_*ion的帖子

当通过 TypeBuilder.CreateType 实现具有带有 'in' 参数的方法的接口时,抛出 TypeLoadException

使用TypeBuilder,我正在构建一个实现包含方法的接口的类。使用 实现该方法后ILGenerator,然后我调用TypeBuilder.CreateType(),在正常情况下一切顺利。但是,如果该方法包含带有in修饰符的任何参数(也称为值类型的只读引用)TypeBuilder.CreateType() ,则会抛出TypeLoadException("Method 'SomeMethod' ... does not have an implementation.")

与通常情况下TypeLoadException所实现的方法与接口中声明的方法不存在相同的签名不同,只有当方法包含in参数(即使签名相同)时才会出现此问题。当我删除或更改in修饰符为refor时outTypeBuilder.CreateType()成功地将生成的方法识别为接口中声明的方法的实现,并且类型正常构建。

这是一个完全可编译的示例:

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Threading;
 
namespace EmitMethodWithInParamTest
{
    public struct StructParam
    {
        public String Data;
    }
 
    public interface ISomeInterface
    {
        Int32 SomeMethod(in StructParam param);
    }
 
    static class EmitExtension
    {
        public static void ReplicateCustomAttributes(this ParameterBuilder paramBuilder, …
Run Code Online (Sandbox Code Playgroud)

c# reflection.emit pass-by-reference typebuilder

8
推荐指数
1
解决办法
608
查看次数