【问题标题】:How to get base class's generic type parameter?如何获取基类的泛型类型参数?
【发布时间】:2012-08-23 08:26:01
【问题描述】:

我有以下三个班级:

public class TestEntity { }

public class BaseClass<TEntity> { }

public class DerivedClass : BaseClass<TestEntity> { }

我已经在运行时使用反射获得了DerivedClassSystem.Type 对象。如何使用反射获取TestEntitySystem.Type 对象?

谢谢。

【问题讨论】:

    标签: c# generics reflection


    【解决方案1】:

    我假设您的代码只是一个示例,您并不明确知道DerivedClass

    var type = GetSomeType();
    var innerType = type.BaseType.GetGenericArguments()[0];
    

    请注意,此代码在运行时很容易失败,您应该验证您处理的类型是否符合您的预期:

    if(type.BaseType.IsGenericType 
         && type.BaseType.GetGenericTypeDefinition() == typeof(BaseClass<>))
    

    还可以有更深的继承树,因此需要一些具有上述条件的循环。

    【讨论】:

    • 我动态获取 DerivedClass 的类型对象,所以不能硬编码。我已经解决了。
    • 我没有硬编码DerivedClass有存根var type = GetSomeType();
    【解决方案2】:

    您可以使用 BaseType 属性。以下代码对于继承中的更改具有弹性(例如,如果您在中间添加另一个类):

    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))
    

    【讨论】:

      【解决方案3】:
      var derivedType = typeof(DerivedClass);
      var baseClass = derivedType.BaseType;
      var genericType = baseClass.GetGenericArguments()[0];
      

      【讨论】:

        【解决方案4】:

        它认为这应该可行:

        var firstGenericArgumentType = typeof(DerivedClass).BaseType.GetGenericArguments().FirstOrDefault();
        

        或者

        var someObject = new DerivedClass();
        var firstGenericArgumentType = someObject.GetType().BaseType.GetGenericArguments().FirstOrDefault();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-08-15
          • 2021-07-10
          • 1970-01-01
          • 2019-02-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多