14

我在方法中有以下代码:

 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
4

3 回答 3

12

不,这是不可能的。

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

诸如继承和接口实现、属性、方法、带有代码的属性等之类的东西。不可能。

于 2010-06-14T13:39:44.413 回答
12

开源框架即兴界面将允许您使用轻量级代理和 DLR 有效地做到这一点。

new { Name = "Red", IsSelected = true}.ActLike<ISelectable>();
于 2011-03-03T01:24:09.023 回答
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 的所有成员;包括读/写属性和事件,这在匿名类型的对象上目前甚至是不可能的。

于 2010-06-14T16:40:55.163 回答