2014-03-06 54 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

無法擴展匿名,但你可以宣佈你的方法接受一個動態參數,如果你真的需要這個工作。

相關問題