【问题标题】:Anonymous class implementing interface [duplicate]匿名类实现接口[重复]
【发布时间】:2010-06-14 13:35:00
【问题描述】:

我在方法中有以下代码:

 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

【问题讨论】:

    标签: c# interface anonymous-class


    【解决方案1】:

    不,这是不可能的。

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

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

    【讨论】:

      【解决方案2】:

      开源框架impromptu-interface 将允许您使用轻量级代理和 DLR 有效地做到这一点。

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

      【讨论】:

      • 这太棒了!我在 LINQPad 中使用它,到目前为止效果很好。
      【解决方案3】:

      即使你能做到这一点,你也几乎肯定不想这样做,因为一个方法会知道匿名类的所有信息(即没有封装,也没有间接访问事物的好处)。

      另一方面,我已经考虑过这样的功能可能看起来如何(如果我想将匿名类型的对象传递给期望特定接口的方法......或者我认为是这样)。

      继承接口 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 的成员;包括读/写属性和事件,这在匿名类型的对象上目前甚至是不可能的。

      【讨论】:

      • 没错,那会很整洁。也许像这样指定匿名类的接口: new {IFoo.Bar = 2}:IFoo;
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      • 2020-03-06
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      相关资源
      最近更新 更多