C# list of "Type" that implements specific interface

2.2k views Asked by At

I want to create a List<System.Type> listOfTypesOfGlasses , where Type must implement a specific interface IGlass , so I could load it with Types of glasses. Is there a way to enforce in compile time this constraint(must implement IGlass) ?

2

There are 2 answers

7
Daniel A. White On BEST ANSWER

Implement a method/class that hides the list.

class YourClass {
    // intentionally incomplete
    private List<Type> listOfTypesOfGlasses;
    public void AddToList<T>() : where T: IGlass
    {
        listOfTypesOfGlasses.Add(typeof(T));
    }
}

Edit: below is the original answer here assuming that Type meant a placeholder, not System.Type.

All you should need to do is List<IGlass>.

or

You should write your own wrapper class around List<T> that has the constraint.

or

Subclass List<T> and put the generic constraint on it - however this practice is discouraged.

0
D Stanley On

No - typeof(IGlass) and typeof(Glass) are both Type objects - not different classes that can be filtered in a generic constraint. There's no generic restriction that works off of the values stored. If you want to store instances of types that all implement IGlass that's possible, but you can't filter the actual Type objects that can be stored.