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))
Share:
17,481

Related videos on Youtube

lucn
Author by

lucn

Updated on September 02, 2022

Comments

  • lucn
    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 of DerivedClass using reflection in runtime. How can I get the System.Type object of TestEntity using reflection?

    Thanks.

  • lucn
    lucn over 11 years
    I get DerivedClass's type object dynamically, so can not hard-coding. I have Resolved.
  • Rafal
    Rafal over 11 years
    I did not hard-code DerivedClass there is stub var type = GetSomeType();