How to get base class's generic type parameter?
17,481
Solution 1
I assume that your code is just a sample and you don't explicitly know DerivedClass
.
var type = GetSomeType();
var innerType = type.BaseType.GetGenericArguments()[0];
Note that this code can fail very easily at run time you should verify if type you handle is what you expect it to be:
if(type.BaseType.IsGenericType
&& type.BaseType.GetGenericTypeDefinition() == typeof(BaseClass<>))
Also there can be deeper inheritance tree so some loop with above condition would be required.
Solution 2
You can use the BaseType property. The following code would be resilient for changes in the inheritance (e.g. if you add another class in the middle):
Type GetBaseType(Type type)
{
while (type.BaseType != null)
{
type = type.BaseType;
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(BaseClass<>))
{
return type.GetGenericArguments()[0];
}
}
throw new InvalidOperationException("Base type was not found");
}
// to use:
GetBaseType(typeof(DerivedClass))
Related videos on Youtube
Author by
lucn
Updated on September 02, 2022Comments
-
lucn over 1 year
I have three class as following:
public class TestEntity { } public class BaseClass<TEntity> { } public class DerivedClass : BaseClass<TestEntity> { }
I already get the
System.Type
object ofDerivedClass
using reflection in runtime. How can I get theSystem.Type
object ofTestEntity
using reflection?Thanks.
-
lucn over 11 yearsI get DerivedClass's type object dynamically, so can not hard-coding. I have Resolved.
-
Rafal over 11 yearsI did not hard-code
DerivedClass
there is stubvar type = GetSomeType();