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

33

假设我有这样一个类:

public class Test {
    public class InnerTest{}
}
现在我有一个 InnerTestTypeInfo 对象。我该如何找到 TestTypeInfo 对象呢?
反过来很简单,我可以使用 GetNestedTypes(),但我找不到一个方法或属性(除了IsNestedType)来确定嵌套类的包含类。
3个回答

42
你可以通过获取属性"DeclaringType"来得到这个。
引用 MSDN:
一个 Type 对象,表示封闭类型(如果当前类型是嵌套类型);或者通用类型定义(如果当前类型是通用类型的类型参数);或者声明通用方法的类型(如果当前类型是通用方法的类型参数);否则为 null。 http://msdn.microsoft.com/en-us/library/system.type.declaringtype.aspx

5

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类型时,甚至有两个类型参数,一个用于外部类,一个用于内部类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接