3 votes

C# - Déterminer au moment de l'exécution si une propriété est un type ou une instance d'objet ?

Je veux déterminer si MyBindingSource.DataSource est affecté à l'ensemble des concepteurs Type ou si une instance d'objet lui a été attribuée. C'est ma solution actuelle (plutôt moche) :

Type sourceT = MyBindingSource.DataSource.GetType();
if( sourceT == null || sourceT.ToString().Equals("System.RuntimeType") ) {
     return null;
}
return (ExpectedObjType) result;

En System.RuntimeType est privé et non accessible, donc je ne peux pas faire ça :

Type sourceT = MyBindingSource.DataSource.GetType();
if ( object.ReferenceEquals(sourceT, typeof(System.RuntimeType)) ) {
     return null;
}
return (ExpectedObjType) result;

Je me demandais simplement si une meilleure solution existait ? En particulier, une solution qui ne repose pas sur l'option Type nom.

1voto

Richard Cook Points 10763

Desde System.RuntimeType est dérivé de System.Type vous devriez être en mesure de faire ce qui suit :

object result = MyBindingSource.DataSource;
if (typeof(Type).IsAssignableFrom(result.GetType()))
{
    return null;
}
return (ExpectedObjType)result;

ou même de manière plus concise :

object result = MyBindingSource.DataSource;
if (result is Type)
{
    return null;
}
return (ExpectedObjType)result;

Par coïncidence, c'est l'approche adoptée aquí .

1voto

KeithS Points 36130

Vous n'avez pas besoin de la ToString() ; vous devriez pouvoir accéder à son nom via GetType() (ce qui revient à peu près au même). De toute façon, comme il s'agit d'une classe privée et qu'elle n'est pas accessible depuis le code du développeur, je pense que vous êtes coincé avec une "chaîne magique" si vous avez besoin de vérifier qu'il s'agit bien d'un RuntimeType. Toutes les "meilleures solutions" ne sont pas aussi élégantes que nous le souhaiterions.

Si tous les paramètres Type que vous obtenez sont en fait des objets RuntimeType, vous pouvez rechercher la classe de base comme cela a été suggéré dans une autre réponse. Cependant, si vous pouvez recevoir un Type qui n'est pas un RuntimeType, vous obtiendrez quelques "faux positifs".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X