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
ведет себя по-другому в этом сценарии?
1 ответ
Я думаю, что это просто оптимизация. Нет смысла хранить ссылку на значение по умолчанию для типа. Просто возвращается default(T)
когда вы пытаетесь получить к нему доступ.
Он просто ведет себя как словарь:
string property = "Address";
object val;
if (!dic.TryGetValue(property, out val))
{
return default(T);
}
else
{
return (T)val; // simplification
}
Какой смысл здесь сохранять Address
в словаре? Никто. Вот почему это удалено.