C# 发出属性的显式接口实现 目标

C# 发出属性的显式接口实现 目标,c#,reflection,reflection.emit,typebuilder,C#,Reflection,Reflection.emit,Typebuilder,所以我想做的是,在运行时用TypeBuilder类创建一个类型。我希望运行时类型从中实现的接口如下所示 公共接口测试 { int TestProperty{get;} } 应生成的类型应如下所示: 内部类测试:ITest { int ITest.TestProperty{get=>0;} } 接口的显式实现并不是真正必要的,但这正是我发现最有用的资源 现在转到实际代码 var assemblyName=新的assemblyName(“AssemblyTest”); var assembly

所以我想做的是,在运行时用
TypeBuilder
类创建一个类型。我希望运行时类型从中实现的接口如下所示

公共接口测试
{
int TestProperty{get;}
}
应生成的类型应如下所示:

内部类测试:ITest
{
int ITest.TestProperty{get=>0;}
}
接口的显式实现并不是真正必要的,但这正是我发现最有用的资源


现在转到实际代码
var assemblyName=新的assemblyName(“AssemblyTest”);
var assemblyBuilder=assemblyBuilder.definedDynamicAssembly(assemblyName,AssemblyBuilderAccess.Run);
var module=assemblyBuilder.DefinedDynamicModule(assemblyName.Name+“.dll”);
var typeBuilder=module.DefineType(“TestType”,TypeAttributes.NotPublic | TypeAttributes.BeforeFieldInit | TypeAttributes.AutoClass | TypeAttributes.AnsiClass | TypeAttributes.Class,null,新[]{typeof(ITest)});
var prop=typeBuilder.DefineProperty(“ITest.TestProperty”,PropertyAttributes.HasDefault,typeof(int),null);
var propGet=typeBuilder.DefineMethod(“ITest.get_TestProperty”,MethodAttributes.Private | MethodAttributes.SpecialName | MethodAttributes.NewSlot | MethodAttributes.HideBySig | MethodAttributes.Virtual | MethodAttributes.Final);
var propertyGetIL=propGet.GetILGenerator();
propertyGetIL.Emit(操作码.Ldc_I4_0);
propertyGetIL.Emit(操作码.Ret);
prop.SetGetMethod(propGet);
typeBuilder.DefineMethodOverride(propGet,typeof(ITest).GetProperty(“TestProperty”).GetMethod());
var type=typeBuilder.CreateType();
作为对代码的简短解释

  • 创建DynamicsSembly/Module/Class
  • 创建备份字段和属性本身
  • 为属性创建Get方法的内容
  • 将属性标记为接口的
  • 创建新类型
  • 但是,
    CreateType
    方法向我抛出了以下问题:

    方法实现中的主体签名和声明不匹配。类型:“TestType”。Assembly:'AssemblyTest,版本=0.0.0.0,区域性=neutral,PublicKeyToken=null'


    我真的不确定如何实现该属性以及这是什么原因。

    在定义get方法时,您缺少返回类型。您需要使用of
    DefineMethod
    指定它:

    var propGet = typeBuilder.DefineMethod("ITest.get_TestProperty", 
      MethodAttributes.Private | MethodAttributes.SpecialName | MethodAttributes.NewSlot | 
      MethodAttributes.HideBySig | MethodAttributes.Virtual | MethodAttributes.Final,
      typeof(int), // <--- return type
      Type.EmptyTypes // <-- parameter types (indexers)
    );
    
    var-propGet=typeBuilder.DefineMethod(“ITest.get\u TestProperty”,
    MethodAttributes.Private | MethodAttributes.SpecialName | MethodAttributes.NewSlot |
    MethodAttributes.HideBySig | MethodAttributes.Virtual | MethodAttributes.Final,
    
    typeof(int),//非常感谢,我真的忘记了返回类型,即使我多次写了那几行。