How to create List of open generic type of class?

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)

Leave a Comment