is there any possibility to have a generic List<System.Type>
and to have a constraint on the type?
I want to store types in a list for a lookup, but only types where the class of this type implements a specific interface.
Something like this:
List<Type> : where typeof(Type) is IMyClass
Is that possible? If not do you have any suggestion on how to solve this issue?
Any help appreciated !
EDIT:
Sorry I haven't been clearer on the subject, but Sign's comment below is correct, I don't have instances available, just types.
Assume the following:
class PluginA : IPlugin { }
class PluginB : IPlugin { }
class PluginC : ISomeOtherInterface { }
var pluginTypes = new List<Type>()
pluginTypes.Add(typeof(PluginA) --> OK
pluginTypes.Add(typeof(PluginB) --> OK
pluginTypes.Add(typeof(PluginC) --> should fail
Yes I could wrap this, but hoped that there would be a better variant which checks during compiletime or hints with intellisense what types are allowed.
if I understood you correctly, you want a list of System.Type which checks that its elements implement a certain interface. This is easy to accomplish. Just implement
IList<Type>
by wrapping most theList<Type>
functionality and add a couple of checkups....
this code will work for base classes as well as interfaces.
Example usage:
If you however don't need
IList
functionality, you can implementIEnumerable<Type>
orISet<Type>
(wrappingHashSet<T>
). List leaves an option to add the same type several times, which it seems to me is something, you don't want.You can specify any type for the
List
, so yes:Okay, I normally wouldn't do this (the answer is so trivial), but as nobody has suggested the most obvious answer... Inheritance.
Done and done.
Well you could write your own wrapper:
You can't add constraints to
List<T>
itself though.You might want to expose the wrapped list directly, or you might want to implement
IList<T>
and just delegate each member to the list. It's hard to say without knowing more about what you're trying to achieve.I see only one way to check it at compile time. You can create class derived from the List and write custom generic Add method to do it.
Something like this:
You will achive all your goals by using generic method i.e. compile time time checkings, intellisense and all other type cheking tools provided by Visual Studio and C# compiler
Yes - make it a
List<IMyClass>
then you can store any instance that implements that interface.