【问题标题】:How to get generic type from object type如何从对象类型中获取泛型类型
【发布时间】:2011-03-06 16:06:44
【问题描述】:

我的课是;

class BaseClass
{

}

class DerivedClass1 : BaseClass
{

}

class GenericClass<T>
{

}

class DerivedClass2 : BaseClass
{
    GenericClass<DerivedClass1> subItem;
}

我想访问 DerivedClass2 类的所有字段。 我使用 System.Reflection 和 FieldInfo.GetValue() 方法;

但我无法获取 subItem 字段。 FieldInfo.GetValue() 方法返回类型为“对象”。 我不能投到GenericClass&lt;DerivedClass1&gt; 或者 我无法获得 DerivedClass1 类型。 我用 BaseClass 试试这个

BaseClass instance = FieldInfo.Getvalue(this) as GenericClass<BaseClass>;

但实例为空。 如何获取带有类型的实例或如何仅获取类型?

【问题讨论】:

    标签: c# generics type-conversion


    【解决方案1】:

    我不确定你想要达到什么目标,但他对我有用:

    var foo = new DerivedClass2();
    var result = typeof(DerivedClass2).GetField("subItem", 
                                                BindingFlags.NonPublic | 
                                                BindingFlags.Instance)
                                      .GetValue(foo);
    var genericClassField = result as GenericClass<DerivedClass1>;
    

    genericClassField 的类型为GenericClass&lt;DerivedClass1&gt; - 当然,在执行此操作之前您必须为其分配一个值,否则结果将是null,为此我向您的DerivedClass2 添加了一个构造函数,它就是这样做的:

    class DerivedClass2 : BaseClass
    {
        GenericClass<DerivedClass1> subItem;
    
        public DerivedClass2()
        {
            subItem = new GenericClass<DerivedClass1>();
        }
    }
    

    编辑:

    要在运行时找出 result 的类型,您可以执行以下操作:

    var foo = new DerivedClass2();
    var result = typeof(DerivedClass2).GetField("subItem", 
                                                BindingFlags.NonPublic | 
                                                BindingFlags.Instance)
                                      .GetValue(foo);
    Type myType = result.GetType().GetGenericArguments()[0];
    

    在示例中,这将返回类型 DerivedClass1。我也认为这个msdn article 可能是相关的。

    【讨论】:

    • 感谢您的回答。但我的问题是我不知道 DerivedClass1 类型。它是通用的。所有从 DBObject 派生的类都将可用。
    • 感谢 BrokenGlass,我已经用不同的方式解决了它。我为 GenericClass 编写了一个基类,GenericClass 的所有字段都在这个基类中。这样我就可以全部使用了。
    猜你喜欢
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 2013-04-17
    • 1970-01-01
    相关资源
    最近更新 更多