2016-05-09 44 views
0

我正在用巫婆写一个班级,以创建员工电话的概览。 我正在将包含电话的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利用了这方面的类型安全和性能优势。

我想可能有更好的方法,然后用if语句检查每个child.property为null吗?还有更好的方式来获得儿童财产?

回答

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

相关问题