C # Тестирование на ноль - PullRequest
       1

C # Тестирование на ноль

3 голосов
/ 22 сентября 2010

Я использую C # для написания простой программы для чтения Active Directory и отображения значения, хранящегося в поле AD, в программе Windows Form.

Если свойство не существует, то происходит сбой программы, ниже приведен мой код, как я могу поймать это и перейти к следующему полю, не делая try / catch для каждого атрибута?

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();

Ответы [ 7 ]

8 голосов
/ 22 сентября 2010

Просто проверка usr.Properties["telephoneNumber"] не будет работать.Вы должны проверить фактическое значение.Причина возникновения ошибки заключается в том, что вы вызываете ToString() для Value, что является нулевым.

user.Properties всегда будет возвращать PropertyValueCollection, независимо от имени свойства, введенного в индексатор коллекций..

Т.е.

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

Вам нужно проверить само значение, наилучший способ - через нулевой оператор объединения:

textBoxFirstName.Text = (usr.Properties["telephoneNumber"].Value 
                            ?? "Not found").ToString();
3 голосов
/ 22 сентября 2010

Сохраните содержимое usr.Properties["telephoneNumber"]; в переменной и проверьте null:

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

textBoxFirstName.Text = (tel != null && tel.Value != null)
                      ? tel.Value.ToString()
                      : "";
2 голосов
/ 22 сентября 2010

Используйте оператор нуль-слияния (??).

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

Таким образом, значение заменяется пустой строкой, если ноль. Вы также можете просто вернуть null вместо String.Empty, причина, по которой ваш код падает, потому что вы пытаетесь вызвать ToString() для значения null.

1 голос
/ 22 сентября 2010

Нечто подобное должно работать.Если phoneNumber не равен NULL, он преобразует значение в строку, в противном случае будет использоваться пустая строка.

textBoxFirstName.Text = usr.Properties["telephoneNumber"].Value != null 
        ? usr.Properties["telephoneNumber"].Value.ToString()
        : "";
0 голосов
/ 09 августа 2016

Используйте этот код

SearchResult.Properties.Contains("property")

Чтобы проверить, есть ли на самом деле объект, загруженный из результатов поиска

0 голосов
/ 22 сентября 2010

Несколько вещей помогут этому быть более изящным:

  • Проверьте usr.Properties ["telephoneNumber"] на null перед вызовом дочерних свойств, таких как Value. Я сам не работал с AD, но большинство индексаторов со строковыми ключами предназначены для изящной обработки несуществующих ключей. CLR, с другой стороны, с радостью сгенерирует исключение NullReferenceException каждый раз, когда вы пытаетесь сослаться на элемент чего-либо, для которого значение равно null.

  • На случай, если AD не взорвется на несуществующем столбце, поместите назначение в блок Try-Catch, который покажет ошибку на экране, и корректно продолжит обработку (или нет). 1010 *

0 голосов
/ 22 сентября 2010
if (usr.Properties["telephoneNumber"] != null)
    textBoxFirstName.Text = usr.Properties["telephoneNumber"].Value.ToString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...