当前位置: 首页 > 知识库问答 >
问题:

发出属性的显式接口实现

夏侯腾
2023-03-14

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

public interface ITest
{
    int TestProperty { get; }
}

应生成的类型应如下所示:

internal class Test : ITest
{
    int ITest.TestProperty { get => 0; }
}

接口的显式实现并不是真正必要的,但这是我找到的最多的资源。

var assemblyName = new AssemblyName("AssemblyTest");
var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
var module = assemblyBuilder.DefineDynamicModule(assemblyName.Name + ".dll");

var typeBuilder = module.DefineType("TestType", TypeAttributes.NotPublic | TypeAttributes.BeforeFieldInit | TypeAttributes.AutoClass | TypeAttributes.AnsiClass | TypeAttributes.Class, null, new[] { 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(OpCodes.Ldc_I4_0);
propertyGetIL.Emit(OpCodes.Ret);

prop.SetGetMethod(propGet);

typeBuilder.DefineMethodOverride(propGet, typeof(ITest).GetProperty("TestProperty").GetGetMethod());

var type = typeBuilder.CreateType();

作为代码的简短解释。

  1. 创建DynamicAssembly/模块/类
  2. 创建备份字段和属性本身
  3. 为属性创建Get方法的内容
  4. 将属性标记为接口的实现
  5. 创建新类型

但是,CreateType方法向我抛出以下内容:

方法实现中的正文和声明的签名不匹配。类型:'TestType'。程序集:'AssemblyTest, Version=0.0.0.0,区域性=中性,PublicKeyToken=null'。

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

共有1个答案

仲高超
2023-03-14

定义 get 方法时缺少返回类型。您需要使用定义方法的不同重载来指定它:

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)
);
 类似资料:
  • 本文向大家介绍详解C#中对于接口的实现方式(隐式接口和显式接口),包括了详解C#中对于接口的实现方式(隐式接口和显式接口)的使用技巧和注意事项,需要的朋友参考一下 C#中对于接口的实现方式有隐式接口和显式接口两种: 隐式地实现接口成员 创建一个接口,IChinese,包含一个成员 Speak;我们创建一个类Speaker,实现接口Chinese 这个就是隐式实现接口。 隐式实现调用方法如下: 都可

  • 我一直在玩扩展方法,以便为现有接口添加一些功能。当我隐式实现接口成员时,编译器选择接口成员实现而不是扩展方法,如本MSDN页面所述。 但是,当我尝试显式实现时,似乎选择了扩展方法而不是接口的实现成员。 当我显式实现给定的扩展方法(下面是CExt)时,它不会绑定。 在这个实现之后,它返回整数值,而不是抛出异常! 然而,当我隐式实现接口成员时(见下文),我的代码会抛出异常。

  • 问题内容: 我有以下实体: 我的属性ScriptItem是其他3个类的接口。是否可以将JPA配置为在运行时执行时设置正确的类ID? 其他资源: 我应该使用哪些注释来让JPA理解要保存3个类之一的ID? 提前致谢, 问题答案: 这确实是一个好主意,但不幸的是,JPA不支持将接口直接映射为实体属性。 您只能映射直接用注释的顶级类。这个顶级类可以实现一个接口。 这个功能已经被要求并讨论了很长时间。 根据

  • 问题内容: 在C#中,如果有两个具有相同方法的基本接口(例如F()),则可以使用显式实现来执行不同的impl。对于F()。这使您可以不同地对待与当前视图相对应的对象:作为IMyInterface1或IMyInterface2。这在Java中可行吗? 问题答案: 不,没有像Java中C#的显式接口实现那样的东西。 从好的方面来说,Java具有协变量返回类型,因此,如果您想提供比接口指定的类型更强的实

  • 这在传统的Java bean(set/get方法)中很简单,但是JavaFX属性包含了可观察的概念和绑定,而且似乎很快就变得复杂起来。 我尝试过绑定,但这使得目标属性不可设置,也尝试过双向绑定,但我只能绑定“相等”,而不能绑定表达式。 我已经开始将实现为,但是处理监听器等似乎需要大量工作。 我将如何用JavaFX的方式来实现这一点?这是我试过的 我认为这是可行的,但我必须定义一个“虚拟”属性,而且