Как использовать отражение, чтобы определить, является ли класс внутренним?
Как гласит название, как вы используете отражение, чтобы проверить, определено ли определение класса как внутреннее? "typeof (...)" возвращает определенные свойства, показанные ниже, но не определяет ли класс как внутренний. Посмотрел на Google, но все, что я мог найти, было много статей о запуске внутренних или защищенных методов с использованием отражения. Это не методы, которые мне интересны в этом случае, но определение класса.
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));
Ответы
Ответ 1
Это классическая проблема. Из MSDN:
Ключевые слова С# protected
и internal
не имеют смысла в IL и не используются в Reflection API. Соответствующие члены в IL являются Family
и Assembly
. Чтобы идентифицировать метод internal
с использованием Reflection, используйте свойство IsAssembly
. Чтобы идентифицировать метод protected internal
, используйте IsFamilyOrAssembly
.
Отражение не показывает способ Type
проверить, есть ли он internal
, protected
или protected internal
.
Ответ 2
Предоставляет ли метод IsVisible значение, которое вы ищете?
Ответ 3
Эх, я не совсем уверен, но, к примеру,
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
'Примечание' Friend 'равно' Internal 'в С#.
Ответ 4
Вот некоторые функции, гарантирующие правильную видимость типа (возможно, реализацию переполнения):
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;
}