Comment utiliser la réflexion pour déterminer si une classe est interne?
Comme le titre l'indique, comment utilisez-vous reflection pour vérifier si une définition de classe est définie comme interne? "typeof(...) "renvoie certaines propriétés indiquées ci-dessous mais pas si une classe est définie comme interne. Regardé sur Google, mais tout ce que j'ai pu trouver était beaucoup d'articles sur l'exécution de méthodes internes ou protégées en utilisant la réflexion. Ce ne sont pas les méthodes qui m'intéressent dans ce cas, mais la définition de classe.
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));
4 réponses
C'est un problème classique. De MSDN :
Les mots-clés C #
protected
etinternal
n'ont aucune signification dans IL et ne sont pas utilisés dans les API de réflexion. Les termes correspondants dans IL sontFamily
etAssembly
. Pour identifier une méthodeinternal
à L'aide de la réflexion, utilisez la propriétéIsAssembly
. Pour identifier une méthodeprotected internal
, Utilisez laIsFamilyOrAssembly
.
Réflexion n'expose pas de manière sur Type
vérifier si il est internal
, protected
ou protected internal
.
La méthode IsVisible Vous donne-t-elle la valeur que vous recherchez?
Voici quelques fonctions garanties pour donner la visibilité correcte du type (probablement une implémentation exagérée):
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;
}
Ehh, Je ne suis pas tout à fait sûr, mais par exemple
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
'Note 'Friend' est égal à 'Internal' en C#.