2014-03-06 51 views
41

这是一个很长的过程,但我有一个有趣的编码情况,我希望能够即时创建匿名类,但能够将它们作为参数传递给期望接口或子类的方法。换句话说,我希望能够做到这样的事情:是否有可能让一个匿名类继承另一个类?

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); 

除了使用命名的类有什么办法吗?

+1

你*可以*使用'dynamic'作为参数类型而不是'MyBase',但是我强烈建议不要这样做,即使是从多个地方被调用的远程机会。 – Dirk

回答

43

否。匿名类型始终隐含地从object派生,并且从不实现任何接口。

从C#5的排除基本部分7.6.10.6:

匿名对象初始化声明一个匿名类型并返回该类型的一个实例。匿名类型是直接从object继承的无名类类型。

所以,如果你想有一个不同的基类要实现一个接口,你需要一个命名的类型。

+0

令人恐慌的是,除了接口之外,我正在考虑这个问题。也许甚至在这个问题被问到的时候...... :) – Chris

7

号从documentation

匿名类型是直接从对象派生类的类型,和不能被转换为任何类型的除对象。

为了解决你的问题,只是普通的类代替匿名类型...

2

无法扩展匿名,但你可以宣布你的方法接受一个动态参数,如果你真的需要这个工作。

相关问题