2010-09-22 5 views
3

J'utilise C# pour écrire un programme simple pour lire Active Directory et afficher la valeur contenue dans un champ AD sur un programme de formulaire Windows.C# Test pour null

Si une propriété n'existe pas alors le programme se bloque, voici mon code, comment puis-je l'attraper et passer au champ suivant sans essayer/attraper pour chaque attribut?

DirectoryEntry usr = new DirectoryEntry("LDAP://" + domain, username, password); 
DirectorySearcher searcher = new DirectorySearcher(usr); 
searcher.Filter = "(sAMAccountName=" + GlobalClass.strUserName + ")"; 
searcher.CacheResults = false; 
searcher.SearchScope = SearchScope.Subtree; 
searcher.PropertiesToLoad.Add("givenName"); 
searcher.PropertiesToLoad.Add("telephoneNumber"); 

//program crashes here if telephoneNumber attribute doesn't exist. 
textBoxFirstName.Text = usr.Properties["telephoneNumber"].Value.ToString(); 

Répondre

8

La simple vérification de usr.Properties["telephoneNumber"] ne fonctionnera pas. Vous devez vérifier la valeur réelle. La raison de l'erreur est que vous appelez ToString() sur Value qui est null.

user.Properties renverra toujours un PropertyValueCollection, quel que soit le nom de la propriété entré dans l'indexeur de collections.

I.e.

var pony = usr.Properties["OMG_PONIES"]; // Will return a PropertyValueCollection 
var value = pony.Value;     // Will return null and not error 

Vous devez vérifier la valeur elle-même, la meilleure façon par l'opérateur coalescent null:

textBoxFirstName.Text = (usr.Properties["telephoneNumber"].Value 
          ?? "Not found").ToString(); 
+0

Mais ne pas échouer si 'usr.Properties [ "telephoneNumber"] 'est-ce que 'null'? –

+0

@Jim Mischel - Non. Ce n'est jamais nul. Regardez mon exemple 'usr.Properties [" OMG_PONIES "]'. J'ai pensé la même chose que le reste des réponses jusqu'à ce que je l'ai testé moi-même. Vous pouvez vous asseoir en tapant 'Properties [" RAR_FOO_DOH "]' et il ne retournera jamais null. – GenericTypeTea

+0

+1, je n'ai pas pensé à vérifier si usr.Properties [] retournerait null. – Brandon

2

Utilisez l'opérateur opérateur null-coalescent (??).

textBoxFirstName.Text = (usr.Properties["telephoneNumber"].Value 
          ?? String.Empty).ToString(); 

De cette façon, la valeur est remplacée par une chaîne vide si nul. Vous pouvez également renvoyer null au lieu de String.Empty, la raison pour laquelle votre code se bloque est que vous essayez d'appeler ToString() sur une valeur null.

1

Quelque chose comme ça devrait fonctionner. Si telephoneNumber n'est pas nul, il convertira la valeur en chaîne, sinon il utilisera une chaîne vide.

textBoxFirstName.Text = usr.Properties["telephoneNumber"].Value != null 
     ? usr.Properties["telephoneNumber"].Value.ToString() 
     : ""; 
3

stocker le contenu de usr.Properties["telephoneNumber"]; dans une variable et vérifier null:

PropertyValueCollection tel = usr.Properties["telephoneNumber"]; 

textBoxFirstName.Text = (tel != null && tel.Value != null) 
         ? tel.Value.ToString() 
         : ""; 
+0

Je pense que c'est la meilleure réponse du groupe, car il n'indexe pas les propriétés deux fois, je n'ai aucune idée de comment c'est bon marché. –

0
if (usr.Properties["telephoneNumber"] != null) 
    textBoxFirstName.Text = usr.Properties["telephoneNumber"].Value.ToString(); 
0

Un couple de choses va aider ce sera plus gracieux:

  • test usr .Properties ["telephoneNumber"] pour null avant d'appeler des propriétés enfants comme Value. Je n'ai pas travaillé avec AD moi-même, mais la plupart des indexeurs à clé de chaîne sont conçus pour gérer avec élégance des clés inexistantes. le CLR, d'autre part, lancera heureusement une exception NullReferenceException chaque fois que vous essayez de référencer un membre de tout ce qui évalue à null. Si, par hasard, AD DOE explose sur une colonne inexistante, placez l'assignation dans un bloc Try-Catch qui affichera une erreur à l'écran et continuera avec élégance le traitement (ou pas).

+3

Les blocs Try-Catch pour NullReferenceExceptions sont une mauvaise idée 99.99% du temps .. –

+1

@Sander: si usr.Properties [] le lance (peu probable mais possible), il n'y a pas grand-chose d'autre à faire, à moins que le dictionnaire ne fournisse un méthode sûre pour vérifier l'existence de colonne comme une méthode ContainsColumn(). – KeithS

+0

ah Je vois ce que vous voulez dire, mais je suis sûr qu'il ne se comporte pas comme ça, et que .Value est ce qui cause l'absence de référence. –

0

Utilisez ce code

SearchResult.Properties.Contains("property") 

Pour vérifier si l'objet a fait l'hélice chargée du résultat de la recherche

+0

Bienvenue dans Stack Overflow! Bien que ce code puisse aider à résoudre le problème, il n'explique pas pourquoi et/ou comment il répond à la question. Fournir ce contexte supplémentaire améliorerait considérablement sa valeur à long terme. S'il vous plaît [modifier] votre réponse pour ajouter une explication, y compris les limitations et les hypothèses qui s'appliquent. –