Here is a DynamicDataObject class derived from 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;
        }
  }
and I am consuming DynamicDataObject like below.
 public MainWindow()
 {
     InitializeComponent();
     dynamic person = new DynamicDataObject();
     person.FirstName = "Vimal";
     person.LastName = "Adams";
     person.Address = null;
 }
I can see all members of person and it's values in the _dataDictionary but at the same time the debugger view excludes members having null value. So that person.Address member is not visible in the dynamic view collection.(please see the below screenshot). Can anyone please help me understanding why DynamicObjectbehaves differently in this scenario? 

I think it is just an optimization. There is no use in keeping a reference to the default value of the type. It just returns default(T) when you try to access it.
It just behaves as a dictionary:
string property = "Address";
object val;
if (!dic.TryGetValue(property, out val))
{
    return default(T);
}
else
{
    return (T)val; // simplification
}
What is the point here to keep Address in the dictionary? None. That is why it is removed.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With