gpt4 book ai didi

c# - 如何添加 ObservableCollection> 为 T 使用继承

转载 作者:行者123 更新时间:2023-11-30 15:02:33 24 4
gpt4 key购买 nike

假设我有以下类(class):

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

然后在应用程序代码的其他地方我有这个:

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

出于某种奇怪的原因,我认为 C# 会由于继承而允许以下内容,但事实并非如此。我想知道的是如何像我在下面做的那样将对象添加到泛型类的集合中(这肯定是人们遇到的常见问题,并且肯定有一个简单的模式/解决方案来完成这个):

_manager.AddConfigList(_configuration);

最佳答案

它不会以这种方式工作,但幸运的是你可以利用 co-variance in generic 来变通,定义一个新的协方差接口(interface):

public interface IConfigList<out T>
{
}

所以你的ConfigList继承了这个接口(interface):

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

关于c# - 如何添加 ObservableCollection<Class<T>> 为 T 使用继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12545270/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com