为什么可以';t我将泛型类型的此实例添加到集合中
本文关键字:实例 添加 集合 泛型类型 为什么 | 更新日期: 2023-09-27 18:24:33
我有两个具有多对多关系的抽象类型:
public abstract class Experiment<T> where T : Sample
{
private List<T> _Samples = new List<T>;
public IReadOnlyCollection<T> Samples {
get { return _Samples.AsReadOnly(); }
}
public void AddSample(T sample)
{
_Samples.Add(sample);
sample.Experiments.Add(this); // The problem lies here
}
}
public abstract class Sample
{
private List<Experiment<Sample>> _Experiments = new List<Experiment<Sample>>;
public ICollection<Experiment<Sample>> Experiments {
get { return _Experiments; }
}
}
正如您所看到的,一个实验接受一个类型参数,它是Sample
的子类。我想做的是:每当Sample
的子类型的实例被添加到Experiment
时,Experiment
就应该相应地添加到Sample
的Experiments
集合中。
当我尝试将Experiment<T>
的实例添加到List<Experiment<Sample>>
的集合时,问题就出现了。由于T
是Sample
的一个亚型,我认为不会有问题。实际发生的情况如下:
Value of type 'Experiment<T>' cannot be converted to 'Experiment<Sample>`
我的问题是,是否有办法解决这个问题,或者更好地模拟这些实体之间的关系。
所以我认为修复方法是:
public abstract class Experiment<T> where T : Sample<T>
{
private List<T> _Samples;
public IReadOnlyCollection<T> Samples {
get { return _Samples.AsReadOnly(); }
}
public void AddSample(T sample)
{
_Samples.Add(sample);
sample.Experiments.Add(this); // The problem lies here
}
}
public abstract class Sample<T> where T : Sample<T>
{
private List<Experiment<T>> _Experiments;
public ICollection<Experiment<T>> Experiments {
get { return _Experiments; }
}
}
因为这两种类型是相互依赖的,所以它们需要共享相同的泛型类型。
public class Experiment<T> where T : Sample
{
private List<T> _Samples = new List<T>();
public IReadOnlyCollection<T> Samples
{
get { return _Samples.AsReadOnly(); }
}
public Experiment()
{
}
public Experiment(IEnumerable<T> samples)
{
_Samples = samples.ToList();
}
public void AddSample(T sample)
{
_Samples.Add(sample);
sample.Experiments.Add(new Experiment<Sample>(_Samples)); // The problem lies here
}
}
public abstract class Sample
{
private List<Experiment<Sample>> _Experiments = new List<Experiment<Sample>>();
public ICollection<Experiment<Sample>> Experiments
{
get { return _Experiments ; }
}
}
通过添加一些构造函数并修改Sample
中的Experiments
集合,我想我能够实现您想要的。现在您可以使用以下代码
public class MySample : Sample{}
public class MyExperiment : Experiment<MySample>{}
MyExperiment me = new MyExperiment();
me.AddSample(new MySample());