使用反射获取嵌套类型的容器类型

时间:2012-07-30 14:56:06

标签: c# .net reflection

说我有这样的课程:

public class Test {
    public class InnerTest{}
}

现在TypeInfoInnerTest个对象。如何从TypeInfo找到InnerTest测试对象?

另一种方法很简单,我可以使用GetNestedTypes(),但我找不到方法或属性(IsNestedType除外)来找出嵌套类的包含类。

3 个答案:

答案 0 :(得分:32)

您可以通过检索属性“DeclaringType”来获取此信息。

引用MSDN:

  

表示封闭类型的Type对象(如果当前类型是嵌套类型);或者泛型类型定义,如果当前类型是泛型类型的类型参数;或者声明泛型方法的类型,如果当前类型是泛型方法的类型参数;否则,null。

http://msdn.microsoft.com/en-us/library/system.type.declaringtype.aspx

答案 1 :(得分:5)

听起来你正在寻找Type.DeclaringType财产。

答案 2 :(得分:0)

除上述之外,我想补充一点,如果涉及泛型类型,它会变得有点复杂,因为泛型类型参数是在内部实例的类型上定义的,而不是 DeclaringType

考虑这个类:

internal class WithGenericArg<T>
    {
        private T _data;

        public WithGenericArg(T data)
        {
            _data = data;
        }

        public class Internal
        {
            public int Foo()
            {
                return 0;
            }
        }

        public class Internal2<T2>
        {
            public T2? _data2;

            public Internal2(T2? data2)
            {
                _data2 = data2;
            }

            public T2? Foo2()
            {
                return _data2;
            }
        }
    }

查看 Inner 的类型时,其 IsGenericType 属性为 true 且 GetGenericArguments() 返回 1 个元素(以及 GenericTypeArguments 在类型关闭时返回 1 个元素) .这是外部(!)类的类型参数的类型参数(或具体类型)。

当查看 Inner2 的类型时,甚至有 2 个类型参数,一个用于外部类,一个用于内部类。