DynamicObject对空值

时间:2015-05-29 14:05:41

标签: 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;
        }
  }

我正在使用DynamicDataObject,如下所示。

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

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

enter image description here

1 个答案:

答案 0 :(得分:3)

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

它只是表现为字典:

string property = "Address";
object val;

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

Address保留在字典中的重点是什么?没有。这就是它被移除的原因。