2012-09-22 50 views
3

說我有以下類:我如何添加一個ObservableCollection <Class<T>>使用繼承對於T

public class BaseConfig 
{ 
} 

public class SpecialConfig : BaseConfig 
{ 
} 

然後,我有一個泛型類的定義將包含這些:

public class ConfigList<T> : ObservableCollection<T> where T : BaseConfig 
{ 
} 

然後我有另一個類,我想擁有一個ConfigList對象的集合:

public class ConfigurationManager 
{ 
    private ObservableCollection<ConfigList<BaseConfig>> _configItems 

    public ConfigurationManager() 
    { 
     _configItems = new ObservableCollection<ConfigList<BaseConfig>>(); 
    } 

    public void AddConfigList(ConfigList<BaseConfig> configList) 
    { 
     _configItems.Add(configList); 
    } 
} 

T母雞在應用程序代碼中的其他地方我有這樣的:

ConfigurationManager _manager = new ConfigurationManager(); 
ConfigList<SpecialConfig> _configuration = new ConfigList<SpecialConfig>(); 

對於一些奇怪的原因,我認爲C#將使以下因繼承,但事實並非如此。我想知道的是,我該如何完成將一個對象添加到泛型類型的集合中,比如我在下面做的(這肯定是人們遇到的一個常見問題,當然有一個簡單的模式/解決方案可以實現這一點):

_manager.AddConfigList(_configuration); 
+0

如何從'ConfigurationManager'返回列表? – svick

回答

5

它不會以這種方式工作,但幸運的是,你可以通過利用co-variance in generic優勢解決,定義了一個新的合作方差接口:

public interface IConfigList<out T> 
{ 
} 

所以你ConfigList繼承了這個接口:

public class ConfigList<T> : ObservableCollection<T>, IConfigList<T> 
            where T : BaseConfig 
{ 
} 

和你ConfigurationManager使用的IConfigList代替ConfigList

public class ConfigurationManager 
{ 
    private ObservableCollection<IConfigList<BaseConfig>> _configItems; 

    public ConfigurationManager() 
    { 
     _configItems = new ObservableCollection<IConfigList<BaseConfig>>(); 
    } 

    public void AddConfigList(IConfigList<BaseConfig> configList) 
    { 
     _configItems.Add(configList); 
    } 
} 

然後它會工作:

ConfigurationManager _manager = new ConfigurationManager(); 
IConfigList<BaseConfig> _configuration = new ConfigList<SpecialConfig>(); 

_manager.AddConfigList(_configuration); 
+0

完美!我知道必須解決這個問題。感謝您快速回答。它爲我節省了大量的時間! – BrianP

0

您需要利用仿製藥covariance來實現此目的。

相關問題