是否有可能使匿名类继承另一个类?

时间:2014-03-06 14:05:10

标签: c# anonymous-class

这是一个很长的镜头,但我有一个有趣的编码情况,我希望能够动态创建匿名类,但能够将它们作为参数传递给期望接口或子类的方法。换句话说,我希望能够做到这样的事情:

public class MyBase { ... }

public void Foo(MyBase something)
{
  ...
}

...
var q = db.SomeTable.Select(t =>
        new : MyBase // yeah, I know I can't do this...
        {
          t.Field1,
          t.Field2,
        });
foreach (var item in q)
  Foo(item);

除了使用命名类之外,还有什么办法吗?

4 个答案:

答案 0 :(得分:48)

没有。匿名类型总是隐式派生自object,并且永远不会实现任何接口。

来自C#5规范的第7.6.10.6节:

  

匿名对象初始值设定项声明匿名类型并返回该类型的实例。匿名类型是直接从object继承的无名类类型。

因此,如果您想要实现一个不同的基类,那么您需要一个命名类型。

答案 1 :(得分:7)

没有。来自documentation

匿名类型是直接从object派生的类类型,不能转换为除object之外的任何类型。

要解决您的问题,只需将匿名类型替换为普通类......

答案 2 :(得分:2)

无法扩展匿名但您可以声明您的方法接受动态参数,如果您确实需要这样做。

答案 3 :(得分:0)

简短回答:否

长答案: 您可以使用C#代理类。有几种工具可以代理类。例如最小起订量。 https://github.com/moq/moq4

相关问题