简体   繁体   中英

How to create List of open generic type of class<T>?

i am working on someone else code i need to add few things i have a class

public abstract class Data<T>
{

}

public class StringData : Data<string>
{
}

public class DecimalData : Data<decimal>
{
}

in my program i want to maintain list of different type of data

List<Data> dataCollection=new List<Data>();

dataCollection.Add(new DecimalData());
dataCollection.Add(new stringData());


List<Data> dataCollection=new List<Data>();

at above line i am getting compiler error Using the generic type 'Data' requires 1 type arguments

Can any one guide what i am doing wrong;

There is no diamond operator in C# yet, so you can't use true polymorphism on open generic type underlying to closed constructed types.

So you can't create a list like this:

List<Data<>> list = new List<Data<>>();

You can't use polymorphism on such list... and it is a lack in genericity here.

For example, in C# you can't create a List<Washer<>> instance to have some Washer<Cat> and some Washer<Dog> to operate Wash() on them...

All you can do is using a list of objects or an ugly non generic interface pattern:

public interface IData
{
  void SomeMethod();
}

public abstract class Data<T> : IData
{
  public void SomeMethod()
  {
  }
}

List<IData> list = new List<IData>();

foreach (var item in list)
  item.SomeMethod();

You can also use a non generic abstract class instead of an interface:

public abstract class DataBase
{
  public abstract void SomeMethod();
}

public abstract class Data<T> : DataBase
{
  public override void SomeMethod()
  {
  }
}

List<DataBase> list = new List<DataBase>();

foreach (var item in list)
  item.SomeMethod();

But you lost some genericity design and strong-typing...

And you may provide any non-generic behavior such as properties and methods you need to operate on.


Generics open and closed constructed types

C# variance problem: Assigning List<Derived> as List<Base>

How to do generic polymorphism on open types in C#?

C#: Is Variance (Covariance / Contravariance) another word for Polymorphism?

C# generic inheritance and covariance part 2

still confused about covariance and contravariance & in/out


Covariance and Contravariance (C#)

Covariance & Contravariance

Generic Classes (C# Programming Guide)

You don't need to use generics for that.

public abstract class Data {

}

public class StringData : Data {
}

public class DecimalData : Data {
}

List<Data> dataCollection = new List<Data>();

dataCollection.Add(new DecimalData());
dataCollection.Add(new StringData());

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM