匿名类实现接口

时间:2010-06-14 13:35:00

标签: c# interface anonymous-class

我在方法中有以下代码:

 var list = new[]
  {
   new { Name = "Red", IsSelected = true },
   new { Name = "Green", IsSelected = false },
   new { Name = "Blue", IsSelected = false },
  };

我想调用一个函数,该函数需要一个元素列表,每个元素实现一个接口(ISelectable)。我知道如何使用普通类完成此操作,但在这种情况下,我只是尝试填写一些演示数据。

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

像这样:

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

3 个答案:

答案 0 :(得分:12)

不,这是不可能的。

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

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

答案 1 :(得分:12)

开源框架impromptu-interface将允许您使用轻量级代理和DLR有效地执行此操作。

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

答案 2 :(得分:1)

即使你可以这样做,你几乎肯定不会想要,因为一个方法会知道关于匿名类的所有内容(即没有封装,间接访问内容也没有任何好处。)

另一方面,我已经考虑过这样一个特征的外观(如果我想将一个匿名类型的对象传递给一个期望特定接口的方法,可能会有用......或者我认为这样)。

继承接口IFoo的匿名类型的最小语法类似于

new {IFoo.Bar = 2} // if IFoo.Bar is a property

or

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

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