2

我见过大量在 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);

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

4

2 回答 2

1

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

于 2013-02-11T17:20:08.503 回答
1

看这个例子。通过使用反射,你可以避免在实现中指定每个可能的类型,但是你还有其他缺点:

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

于 2013-02-10T10:25:40.037 回答