Best way to illustrate my question is with this example code:
class Item {}
class Container< T > {}
class Program
{
static void DoSomething( object something )
{
if( typeof( Item ) == something.GetType() )
{
System.Console.WriteLine( "Item" );
}
else if( typeof( Container<> ) == something.GetType() )
{
System.Console.WriteLine( "Container<>" );
}
}
static void Main( string[] args )
{
DoSomething( new Item() );
DoSomething( new Container< int >() );
}
}
The following line will not work:
else if( typeof( Container<> ) == something.GetType() )
Is it a way to make it work without explicitly changing Container<>
into Container<int>
? I want to know that object is of 'Container' type and I really has no interest is it Container<int>
or Container<string>
. Any hints other than dozens lines of reflection?
From the point of view of reflection, the difference between a generic type and an ordinary type is that a generic type has associated with it a set of type parameters (if it is a generic type definition) or type arguments (if it is a constructed type). A generic method differs from an ordinary method in the same way.
If you want to check if it's an instance of a generic type: return list. GetType().
Generic arguments, or arguments applied to an entire class or group of opposing arguments, occur frequently in academic debate. Many generic argument positions endure across debate resolutions.
Not really. You need to use reflection, basically. Generics are really aimed at static typing rather than types only known at execution time.
Try:
typeof(Container<>) == something.GetType().GetGenericTypeDefinition()
Note that this will only return true if the actual type is Container<T>
. It doesn't work for derived types. For instance, it'll return false
for the following:
class StringContainer : Container<string>
If you need to make it work for this case, you should traverse the inheritance hierarchy and test each base class for being Container<T>
:
static bool IsGenericTypeOf(Type genericType, Type someType)
{
if (someType.IsGenericType
&& genericType == someType.GetGenericTypeDefinition()) return true;
return someType.BaseType != null
&& IsGenericTypeOf(genericType, someType.BaseType);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With