2016-05-09 3 views
0

Im, пишущий класс с ведьмой, создает обзор для телефонов сотрудников. Я получаю информацию об объекте Activesync, содержащем телефоны в качестве детей.
Назначение значений из объекта с известными свойствами

Это мой текущий код. Он работает, если у ребенка нет никаких нулей.

foreach (DirectoryEntry child in directoryObject.Children) 
      { 
       var activeSyncPhone = new ActiveSync.Phone(); 

       activeSyncPhone.Cn = child.Properties["cn"].Value.ToString(); //string 
       activeSyncPhone.DistinguishedName = child.Properties["distinguishedName"].Value.ToString(); //sting 
       activeSyncPhone.InstanceType = (int)child.Properties["instanceType"].Value; //int 
       activeSyncPhone.WhenCreated = (DateTime)child.Properties["whenCreated"].Value; //datetime 
       activeSyncPhone.WhenChanged = (DateTime)child.Properties["whenChanged"].Value; //datetime 
       activeSyncPhone.Name = child.Properties["name"].Value.ToString(); //string 
       activeSyncPhone.ObjectCategory = child.Properties["objectCategory"].Value.ToString(); //string 
       activeSyncPhone.MsExchFirstSyncTime = (DateTime)child.Properties["msExchFirstSyncTime"].Value;//datetime 
       activeSyncPhone.MsExchDeviceEASVersion = child.Properties["msExchDeviceEASVersion"].Value.ToString();//string 
       activeSyncPhone.MsExchDeviceFriendlyName = child.Properties["msExchDeviceFriendlyName"].Value.ToString(); //string 
       activeSyncPhone.MsExchDeviceAccessState = (ActiveSync.Phone.DeviceAccessState)child.Properties["msExchDeviceAccessState"].Value; //int 
       activeSyncPhone.MsExchDeviceID = child.Properties["msExchDeviceID"].Value.ToString(); //string 
       activeSyncPhone.MsExchDeviceType = child.Properties["msExchDeviceType"].Value.ToString(); //string 
       try 
       { 
        activeSyncPhone.MsExchDeviceIMEI = child.Properties["msExchDeviceIMEI"]?.Value.ToString(); //string 
       } 
       catch 
       { 
        activeSyncPhone.MsExchDeviceIMEI = "Could not find IMEI"; 
       } 

       activeSyncPhone.MsExchDeviceUserAgent = child.Properties["msExchDeviceUserAgent"].Value.ToString(); //string 
       activeSyncPhone.MsExchVersion = child.Properties["msExchVersion"].Value.ToString(); //string 
       activeSyncPhone.MsExchDeviceAccessStateReason = (ActiveSync.Phone.DeviceAccessStateReason)child.Properties["msExchDeviceAccessStateReason"].Value; //string 
       activeSyncPhone.MsExchUserDisplayName = child.Properties["msExchUserDisplayName"].Value.ToString(); //string 
       activeSyncPhone.MsExchDeviceModel = child.Properties["msExchDeviceModel"].Value.ToString(); //string 
       activeSyncPhone.MsExchDeviceOS = child.Properties["msExchDeviceOS"].Value.ToString(); //string 
       activeSyncPhone.ObjectGUID = child.Properties["objectGUID"].Value.ToString(); //string 
       activeSyncUnits.PhoneList.Add(activeSyncPhone); 


       child.Close(); 
      } 
      directoryObject.Close(); 

Мне было интересно, есть ли способ сделать это более надежным. Я искал настройку свойств ActiveSyncPhone динамически, а затем со списком задал все свойства. Но C# - строго типизированный язык, и я понял, что id использует преимущества безопасности и производительности, которые сопровождают этот аспект.

Я думаю, что может быть лучше, чем проверка каждого child.property для null с операторами if? и также есть лучший способ получить свойства ребенка?

ответ

1

Вы можете создать общую функцию для этого:

// you'll have to figure out the type of the `child.Properties` 
public static T GetValue<T>(TypeOfChildProperties properties, string name, T defaultValue = default(T)) 
{ 
    var value = properties[name]; 

    if (value == null) 
     return defaultValue; 

    return (T)value; 

    // if you have some cast problems, you could use this: 
    return (T)Convert.ChangeType(value, typeof(T)); 
} 

activeSyncPhone.Cn = GetValue<string>(child.Properties, "cn"); 
activeSyncPhone.DistinguishedName = GetValue<string>(child.Properties, "distinguishedName"); 
activeSyncPhone.InstanceType = GetValue<int>(child.Properties, "instanceType"); 
activeSyncPhone.MsExchDeviceIMEI = GetValue<string>(child.Properties, "msExchDeviceIMEI", "Could not find IMEI"); 
+0

простое и элегантное решение, это нравится :) Спасибо так много. – Sondre