正如标题所说,如何使用反射来检查类定义是否定义为
internal
?
typeof(...)
返回如下所示的某些属性,但不返回类是否定义为 internal
。在 Google 上查找,但我能找到的只是很多关于使用反射运行 internal
或 protected
方法的文章。
我对本例感兴趣的不是方法,而是类定义。
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# 关键字
和protected
在 IL 中没有任何意义,并且不在 Reflection API 中使用。 IL 中对应的术语是internal
和Family
。要使用反射识别Assembly
方法,请使用internal
属性。要识别IsAssembly
方法,请使用protected internal
。IsFamilyOrAssembly
反射不会暴露
Type
上的路径,检查它是否为 internal
、protected
或 protected internal
。
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# 中'Friend' 等于 'Internal'。