以下是从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
在这种情况下表现不同?
答案 0 :(得分:3)
我认为这只是一种优化。保持对类型的默认值的引用没有用处。当您尝试访问它时,它只会返回default(T)
。
它只是表现为字典:
string property = "Address";
object val;
if (!dic.TryGetValue(property, out val))
{
return default(T);
}
else
{
return (T)val; // simplification
}
将Address
保留在字典中的重点是什么?没有。这就是它被移除的原因。