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 回答