9

これはDynamicDataObjectから派生したクラスですDynamicObject

 public class DynamicDataObject : DynamicObject
 {
        private readonly Dictionary<string, object> _dataDictionary = new Dictionary<string, object>();

        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            return _dataDictionary.TryGetValue(binder.Name, out result);
        }

        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            if (!_dataDictionary.ContainsKey(binder.Name))
            {
                _dataDictionary.Add(binder.Name, value);
                return true;
            }

            return false;
        }

        public override IEnumerable<string> GetDynamicMemberNames()
        {
            return _dataDictionary.Keys;
        }
  }

そして、私はDynamicDataObject以下のように消費しています。

 public MainWindow()
 {
     InitializeComponent();
     dynamic person = new DynamicDataObject();
     person.FirstName = "Vimal";
     person.LastName = "Adams";
     person.Address = null;
 }

のすべてのメンバーpersonとその値を_dataDictionary表示できますが、同時にデバッガー ビューではnull値を持つメンバーが除外されます。そのperson.Addressメンバーは動的ビュー コレクションには表示されません (下のスクリーンショットを参照してください)。DynamicObjectこのシナリオで動作が異なる理由を理解するのを手伝ってくれる人はいますか?

ここに画像の説明を入力

4

1 に答える 1

3

単なる最適化だと思います。型のデフォルト値への参照を保持しても意味がありません。default(T)アクセスしようとすると返ってきます。

それは単に辞書として振る舞います:

string property = "Address";
object val;

if (!dic.TryGetValue(property, out val))
{
    return default(T);
}
else
{
    return (T)val; // simplification
}

ここでAddress辞書に残すポイントは何ですか? なし。それが削除される理由です。

于 2015-05-29T14:10:27.317 に答える