Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在同一集合中存储不同类型的泛型类(所有类都具有泛型基类)?_C#_Generics_Collections_Base Class - Fatal编程技术网

C# 如何在同一集合中存储不同类型的泛型类(所有类都具有泛型基类)?

C# 如何在同一集合中存储不同类型的泛型类(所有类都具有泛型基类)?,c#,generics,collections,base-class,C#,Generics,Collections,Base Class,我有一个类似的问题 我也在网上看到了成千上万的帖子,上面说你可以把任何扩展了特定基类的泛型类放到基类类型的集合中。我完全理解这一点 我的问题在一个基本方面不同于上面的链接帖子和其他帖子——我的泛型类有一个基类也是泛型的。更糟糕的是,这是一个非常大的MVVM应用程序框架(内部构建)的一部分,通用基类也有一个基类等等。。。每个基类都添加了某些属性和功能,看起来有点像这样: public abstract class BaseSynchronisableDataType<T> : Base

我有一个类似的问题

我也在网上看到了成千上万的帖子,上面说你可以把任何扩展了特定基类的泛型类放到基类类型的集合中。我完全理解这一点

我的问题在一个基本方面不同于上面的链接帖子和其他帖子——我的泛型类有一个基类也是泛型的。更糟糕的是,这是一个非常大的MVVM应用程序框架(内部构建)的一部分,通用基类也有一个基类等等。。。每个基类都添加了某些属性和功能,看起来有点像这样:

public abstract class BaseSynchronisableDataType<T> : BaseAuditDataType, 
    ISynchronisable<T>, ICloneable<T>, IEquatable<T> where T : class, ICloneable<T>,
    IEquatable<T>, new()

DataListEntry这里有一个关键的原则,你需要理解——类
Foo
不是
Foo
的子类,即使
Child
Parent
的子类。这意味着
列表
不能包含
列表
的实例,就像它不能包含字符串或int32一样

要理解为什么会出现这种情况,请想象以下代码(它不编译,但说明了为什么上述语句需要为真):

然后做:

List<IDataListEntry> myDataListEntries = new List<IDataListEntry>();
myDataListEntries.Add(new Writer(...));
myDataListEntries.Add(new Artist(...));
IEnumerable artists = myDataListEntries.Where(dle => typeof(Artist).IsAssignableFrom(dle.TheTypeOfT));
List myDataListEntries=new List();
添加(新的编写器(…);
添加(新艺术家(…);
IEnumerable artists=myDataListEntries.Where(dle=>typeof(Artist.IsAssignableFrom(dle.TheTypeOfT));

这里有一个关键的原则,你需要理解——类
Foo
不是
Foo
的子类,即使
子类是
父类的子类。这意味着
列表
不能包含
列表
的实例,就像它不能包含字符串或int32一样

要理解为什么会出现这种情况,请想象以下代码(它不编译,但说明了为什么上述语句需要为真):

然后做:

List<IDataListEntry> myDataListEntries = new List<IDataListEntry>();
myDataListEntries.Add(new Writer(...));
myDataListEntries.Add(new Artist(...));
IEnumerable artists = myDataListEntries.Where(dle => typeof(Artist).IsAssignableFrom(dle.TheTypeOfT));
List myDataListEntries=new List();
添加(新的编写器(…);
添加(新艺术家(…);
IEnumerable artists=myDataListEntries.Where(dle=>typeof(Artist.IsAssignableFrom(dle.TheTypeOfT));

我会回到基础,使用一些简单的linq来获得类筛选列表

声明类型对象的列表
DataList L
,然后当您被要求输入类型时,调用过滤列表的
L.OfType()
。对象将是您可以使用的最通用的东西。您可能可以使用all扩展的基类型,但是因为它是抽象的,我不知道您是否可以声明该类型的列表

在我自己的代码中,我使用泛型约束来实现类似的功能

public abstract class BusinessObjectBase : //some interfaces
{
    //class stuff and events
}
我有一堆扩展基类的对象,现在我可以这样做了

Collection<BusinessObjectBase> temp = new Collection<BusinessObjectBase>();
temp.Add(new RXEvents());
temp.Add(new RXBattery());
temp.Add(new RXBHA());
Collection temp=new Collection();
临时添加(新RXEvents());
临时添加(新RXBattery());
临时添加(新RXBHA());
我添加到列表中的每个类都是通过扩展BusinessObjectBase创建的。您正在尝试一些非常相似的东西,但是您的基本实现是不同的。通过将基类型本身声明为模板,您正在破坏基类型。注意,Base和Base是一样的,除了object之外,它们没有实现任何共同点

Base
Base
Base
无关。现在如果你像这样关心它

public abstract class BaseSynchronisableDataType<T> : BaseAuditDataType, ISynchronisable<T>, ICloneable<T>, IEquatable<T> where T : MyCustomBaseClass, ICloneable<T>, IEquatable<T>, new()
公共抽象类BaseSynchronizableDataType:BaseAuditDataType,ISynchronisable,iClonable,IEquatable其中T:MyCustomBaseClass,iClonable,IEquatable,new()

然后可以使用
MyCustomBaseClass
作为列表类型,因为可以保证
表示的所有对象都是它的子对象。这似乎违背了创建BaseSynchronisableDataType的目的,不过…

我会回到基本的部分,并使用一些简单的linq来获得类筛选列表

声明类型对象的列表
DataList L
,然后当您被要求输入类型时,调用过滤列表的
L.OfType()
。对象将是您可以使用的最通用的东西。您可能可以使用all扩展的基类型,但是因为它是抽象的,我不知道您是否可以声明该类型的列表

在我自己的代码中,我使用泛型约束来实现类似的功能

public abstract class BusinessObjectBase : //some interfaces
{
    //class stuff and events
}
我有一堆扩展基类的对象,现在我可以这样做了

Collection<BusinessObjectBase> temp = new Collection<BusinessObjectBase>();
temp.Add(new RXEvents());
temp.Add(new RXBattery());
temp.Add(new RXBHA());
Collection temp=new Collection();
临时添加(新RXEvents());
临时添加(新RXBattery());
临时添加(新RXBHA());
我添加到列表中的每个类都是通过扩展BusinessObjectBase创建的。您正在尝试一些非常相似的东西,但是您的基本实现是不同的。通过将基类型本身声明为模板,您正在破坏基类型。注意,Base和Base是一样的,除了object之外,它们没有实现任何共同点

Base
Base
Base
无关。现在如果你像这样关心它

public abstract class BaseSynchronisableDataType<T> : BaseAuditDataType, ISynchronisable<T>, ICloneable<T>, IEquatable<T> where T : MyCustomBaseClass, ICloneable<T>, IEquatable<T>, new()
公共抽象类BaseSynchronizableDataType:BaseAuditDataType,ISynchronisable,iClonable,IEquatable其中T:MyCustomBaseClass,iClonable,IEquatable,new()

然后可以使用
MyCustomBaseClass
作为列表类型,因为可以保证
表示的所有对象都是它的子对象。这似乎违背了创建BaseSynchronisableDataType的目的…

好的,所以问题是我无法声明以下内容

DataList<Artist> artists = new DataList<Artist>();
DataList艺术家=新建DataList();
BaseDataListEntry
类由于对
DataList
扩展的泛型
BaseSynchronisableCollection
类的泛型约束而不是泛型时。它需要<代码
DataList<Artist> artists = new DataList<Artist>();