关于c#:匿名类实现接口

Anonymous class implementing interface

本问题已经有最佳答案,请猛点这里访问。

我在一个方法中有以下代码:

1
2
3
4
5
6
 var list = new[]
  {
   new { Name ="Red", IsSelected = true },
   new { Name ="Green", IsSelected = false },
   new { Name ="Blue", IsSelected = false },
  };

我想调用一个函数,该函数需要一个元素列表,其中每个元素实现一个接口(iselectable)。我知道如何在普通类中完成这一点,但在本例中,我只想填充一些演示数据。

是否可以创建实现接口的匿名类?

这样地:

1
new { Name ="Red", IsSelected = true } : ISelectable


开放源码框架即兴接口将允许您通过轻量级代理和DLR有效地完成这一任务。

1
new { Name ="Red", IsSelected = true}.ActLike<ISelectable>();


不,这是不可能的。

匿名类型应该是内部的轻量级传输对象。当您需要比小语法提供更多的功能时,您必须将其实现为一个普通的命名类型。

继承和接口实现、属性、方法、带代码的属性等不可能实现。


即使您可以这样做,您几乎肯定也不想这样做,因为一个方法将了解匿名类的所有信息(即,没有封装,也没有间接访问的好处)。

另一方面,我已经考虑了这样一个特性的外观(如果我想将一个匿名类型的对象传递给一个需要特定接口的方法,这可能很有用……我想是这样)。

继承接口ifoo的匿名类型的最基本语法如下

1
2
3
4
5
new {IFoo.Bar = 2} // if IFoo.Bar is a property

or

new {IFoo.Bar() = () => do stuff} if IFoo.Bar is a method

但这是一个简单的例子,其中ifoo只有一个属性或方法。通常,您必须实现ifoo的所有成员;包括读/写属性和事件,这些属性和事件目前在匿名类型的对象上甚至不可能实现。