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 в словаре? Никто. Вот почему это удалено.

Другие вопросы по тегам