Динамическое представление ExpandoObjects скрывает свойства с нулевыми значениями

У меня есть код, который работает с ExpandoObjects, заполненными вызовами базы данных. Неизменно некоторые значения равны нулю. Когда я смотрю на объекты как на ExpandoObject, я вижу все ключи и значения (включая нули) в базовом словаре. Но если я попытаюсь получить к ним доступ через динамическую ссылку, любой ключ, имеющий соответствующее нулевое значение, не будет отображаться в динамическом представлении объекта. Я получаю исключение ArgumentNullException, когда пытаюсь получить к нему доступ через синтаксис свойств динамической ссылки.

Я знаю, что могу обойти это, работая напрямую с ExpandoObject, добавляя кучу уловок попыток, отображая Expando на конкретный тип и т. Д., Но это в первую очередь противоречит цели наличия этого динамического объекта. Код, использующий динамический объект, работал бы нормально, если бы некоторые свойства имели нулевые значения. Есть ли более изящный или сжатый способ «показать» эти динамические свойства, которые имеют нулевые значения?

Вот код, демонстрирующий мою "проблему"

dynamic dynamicRef = new ExpandoObject();
ExpandoObject expandoRef = dynamicRef;

dynamicRef.SimpleProperty = "SomeString";
dynamicRef.NulledProperty = null;

string someString1 = string.Format("{0}", dynamicRef.SimpleProperty);

// My bad; this throws because the value is actually null, not because it isn't
// present.  Set a breakppoint and look at the quickwatch on the dynamicRef vs.
// the expandoRef to see why I let myself be led astray.  NulledProperty does not
// show up in the Dynamic View of the dynamicRef
string someString2 = string.Format("{0}", dynamicRef.NulledProperty);

person Tim Trout    schedule 06.03.2012    source источник
comment
ExpandoObject может сохранять нулевые значения и извлекать их. Вы уверены, что вызывает исключение аргумента NULL?   -  person jbtule    schedule 07.03.2012
comment
Если ключ присутствует в ExpandoObject, он вернет его независимо от того, null или нет. Если его нет, он выдаст RuntimeBinderException. Он не выдаст ArgumentNullException, поэтому в вашем коде должна быть какая-то ошибка. Не могли бы вы показать нам код, который выдает?   -  person svick    schedule 07.03.2012
comment
Хорошо, я думаю, что меня просто вводит в заблуждение окно просмотра Visual Studio. Код генерирует исключение ArgumentNullException, потому что значение фактически равно нулю, а не потому, что свойство отсутствует. Когда я устанавливаю часы на динамическую ссылку, она не показывает свойство, если оно имеет нулевое значение. Если я поставлю часы, следящие за ссылкой ExpandoObject на тот же объект, он покажет имя свойства в базовом списке ключей.   -  person Tim Trout    schedule 07.03.2012


Ответы (1)


Проблема, с которой вы столкнулись, заключается в том, что динамический вызов перегрузки среды выполнения выбирает string .Format(format, params object[] args) вместо предполагаемого string.Format(string format, object arg0), простое приведение переключится на статический вызов string.Format и исправит его.

string someString2 = string.Format("{0}", (object)dynamicRef.NulledProperty);
person jbtule    schedule 07.03.2012
comment
Идеально! Это позаботилось об этом. - person Tim Trout; 07.03.2012