如何使用reflection来确定一个类是否是内部的?

正如标题所说,如何使用reflection来检查类定义是否定义为内部? “typeof(…)”返回下面显示的某些属性,但不返回类是否定义为内部属性。 看了谷歌,但我能找到的很多关于使用reflection运行内部或受保护方法的文章。 这不是我对这种情况感兴趣的方法,而是类定义。

var type = typeof(Customer); Assert.IsTrue(type.IsClass); Assert.That(type.IsAbstract, Is.EqualTo(isAbstract)); Assert.That(type.IsPublic, Is.EqualTo(isPublic)); Assert.That(type.IsPublic, Is.EqualTo(isPublic)); Assert.That(type.IsSealed, Is.EqualTo(isSealed)); Assert.That(type.IsSerializable, Is.EqualTo(isSerializable)); 

这是一个经典问题。 来自MSDN :

C#关键字protectedinternal在IL中没有任何意义,并且不在Reflection API中使用。 IL中的相应术语是FamilyAssembly 。 要使用Reflection标识internal方法,请使用IsAssembly属性。 要标识protected internal方法,请使用IsFamilyOrAssembly

如果internalprotectedprotected internal ,reflection不会在Type检查上公开。

IsVisible方法是否为您提供所需的价值?

以下是一些保证提供正确的类型可见性的函数(可能是一个过度杀伤实现):

 bool isPublic(Type t) { return t.IsVisible && t.IsPublic && !t.IsNotPublic && !t.IsNested && !t.IsNestedPublic && !t.IsNestedFamily && !t.IsNestedPrivate && !t.IsNestedAssembly && !t.IsNestedFamORAssem && !t.IsNestedFamANDAssem; } bool isInternal(Type t) { return !t.IsVisible && !t.IsPublic && t.IsNotPublic && !t.IsNested && !t.IsNestedPublic && !t.IsNestedFamily && !t.IsNestedPrivate && !t.IsNestedAssembly && !t.IsNestedFamORAssem && !t.IsNestedFamANDAssem; } // only nested types can be declared "protected" bool isProtected(Type t) { return !t.IsVisible && !t.IsPublic && !t.IsNotPublic && t.IsNested && !t.IsNestedPublic && t.IsNestedFamily && !t.IsNestedPrivate && !t.IsNestedAssembly && !t.IsNestedFamORAssem && !t.IsNestedFamANDAssem; } // only nested types can be declared "private" bool isPrivate(Type t) { return !t.IsVisible && !t.IsPublic && !t.IsNotPublic && t.IsNested && !t.IsNestedPublic && !t.IsNestedFamily && t.IsNestedPrivate && !t.IsNestedAssembly && !t.IsNestedFamORAssem && !t.IsNestedFamANDAssem; } 

呃,我不太确定,但是,例如

 Public Function PublicFriendOrPrivate(t As Type) As String If t.IsPublic Then Return "Public" Else If t.IsNotPublic AndAlso t.IsNested Then Return "Private" Else Return "Friend" End If End If End Function 

‘注意’朋友’在C#中等于’内部’。