2011-11-09 84 views
2

有沒有辦法爲一個開放的泛型類型聲明一個vaiable?如何爲open generic類型聲明變量?可能?

鑑於:用戶從工廠方法中獲得了一個通用類Logger。有沒有辦法讓一個可以容納任何記錄器的變量?

現在,Logger只從Logger繼承,因爲它能夠爲實例聲明一個變量而不關心在那裏記錄了哪種類型。

我使用MEF,並且在導出中,我可以使用類似[Export(typeof(Logger <>))]的語法來導出泛型類型...(指定導入時的確切類型),因此有一些支持對於開放類型(至少在typeof中)。我現在需要的是一種語法,如

Logger <> Logger {get;組; }

有沒有可能做類似的事情?這個特殊的語法讓我「需要類型」。

+0

爲什麼不使用'object'? –

+0

@Lasse:我猜是因爲'myObject.Log(something)'會產生一個編譯錯誤(即該變量不是* only *用於存儲引用)。 'dynamic'會是一個選項,但是你會失去編譯時語法檢查。 – Heinzi

+0

就是這樣。我向日誌服務器尋求類型X的記錄器(對於配置),但我不想記錄到特定的genric類型,所有的東西都是基礎的一部分。我有時可能會通過記錄器(子類等),他們不需要知道。我試圖避免(在這裏和其他情況下)基類JUST有一個。 – TomTom

回答

2

如果記錄器的類型參數是covariant,即,如果它聲明爲out modifier,那麼您可以使用Logger<object>

IEnumerable<object> = new List<string>; // this works, because IEnumerable is covariant 

如果記錄儀的類型參數不是協變的,也就是說,如果您使用它作爲一個輸入參數的地方,例如然後實現一個通用的接口(或者使用一個通用的基類)似乎是實現你的目標的唯一方法。