How to create List of open generic type of class?

后端 未结 2 342
野性不改
野性不改 2020-12-07 06:20

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

public abstract class Data
{

}

public class StringData : Data

        
相关标签:
2条回答
  • 2020-12-07 06:53

    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());
    
    0 讨论(0)
  • 2020-12-07 07:02

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

    Generics -Open and closed constructed Types

    Generic Classes (C# Programming Guide)

    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.

    0 讨论(0)
提交回复
热议问题