Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

DynamicObject behaves differently for null values

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?

enter image description here

like image 380
Vimal CK Avatar asked May 29 '15 14:05

Vimal CK


1 Answers

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.

like image 111
Patrick Hofman Avatar answered Oct 18 '22 22:10

Patrick Hofman