0

魔女と一緒にクラスを書いていると、従業員の電話で概要が作成されます。電話を子として含む情報フォーム Activesync オブジェクトを取得しています。

これが私の現在のコードです。子にnullが含まれていない場合に機能します。

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# は厳密に型指定された言語であり、その側面に伴う型の安全性とパフォーマンスの利点を利用することを考えました。

if ステートメントですべての child.property の null をチェックするよりも良い方法があると思いますか? また、子プロパティを取得するためのより良い方法はありますか?

4

1 に答える 1

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");
于 2016-05-09T07:10:07.563 に答える