DynamicObject对空值的行为有所不同

Vim*_* CK 9 c# dynamic dynamicobject

这是一个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;
        }
  }
Run Code Online (Sandbox Code Playgroud)

我正在消费DynamicDataObject如下.

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

我可以看到所有成员person和它的值,_dataDictionary但同时调试器视图排除了具有null值的成员.因此该person.Address成员在动态视图集合中不可见.(请参见下面的屏幕截图).任何人都可以帮助我理解为什么DynamicObject在这种情况下表现不同?

在此输入图像描述

Pat*_*man 3

我认为这只是一个优化。保留对该类型的默认值的引用是没有用的。default(T)当您尝试访问它时它就会返回。

它只是充当字典:

string property = "Address";
object val;

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

保留Address在字典中的意义是什么?没有任何。这就是它被删除的原因。