Динамическое представление ExpandoObjects «скрывает» свойства с нулевыми значениями - PullRequest
4 голосов
/ 06 марта 2012

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

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

Вот код, который демонстрирует мою «проблему»

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);

1 Ответ

3 голосов
/ 07 марта 2012

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

string someString2 = string.Format("{0}", (object)dynamicRef.NulledProperty);
...