Reputation: 531
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
) ?
Upvotes: 4
Views: 2577
Reputation: 152566
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.
Upvotes: 1
Reputation: 190941
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.
Upvotes: 6