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 DynamicObject
behaves 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