是否有任何实用程序可以动态生成在运行时实现接口的对象

本文关键字:运行时 实现 接口 对象 任何 实用程序 动态 是否 | 更新日期: 2023-09-27 17:58:37

我见过很多用C#实现动态编程的开源框架。有没有一个可以在没有任何实际具体类的情况下生成接口的实现?

具体来说,假设您有:

interface IThing {
  int Id { get; set; } 
  string Name { get; set; }
}

您还需要将对象映射到IThing:的实例中

class Foo {
  public int FooBarId { get; set; }
  public string FooBarName { get; set; }
}

我假设的助手会让我写一些类似的东西:

IThing concreteThing = helper.Implement<IThing, Foo>()
  PropertyGetter(x => x.Id).Returns(foo => foo.FooBarId)
  PropertyGetter(x => x.Name).Returns(foo => foo.FooBarName);

我想在我的假设示例中,它会将抛出异常的存根放入我没有提供的其他属性的setter中。。。

是否有任何实用程序可以动态生成在运行时实现接口的对象

我有一个开源框架ImpromptuInterface(在nuget中),它给定一个接口,将生成DLR调用的存根(甚至递归)。这意味着您可以通过DynamicObject的实现在其背后添加任何您喜欢的逻辑。

请参阅此示例。通过使用反射,您可以避免在实现中指定每种可能的类型,但也有其他缺点:

owner参数不公开函数所需的任何类型信息。您需要手动检查它们。反射开销会降低每次调用的性能。反射降低了可维护性(必须以不同的方式实现该方法)。有些操作(如Indexers)很难用Reflection处理。在C#等静态类型语言中,类的接口定义了支持哪些操作。支持的操作可能是调用具有指定签名的方法,或者获取或设置属性,或者能够附加到特定事件。在大多数情况下,这是完全合理的,因为编译器能够验证指定类型是否支持操作。