2012-03-06 2 views
5

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

Я знаю, что я мог бы обойти это, работая непосредственно с ExpandoObject, добавляя кучу попыток уловов, сопоставляя 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); 
+0

Устранение неполадок ExpandoObject может хранить нулевые значения и вытаскивать их, вы уверены в том, что вызывает аргумент null exception? – jbtule

+1

Если ключ присутствует в 'ExpandoObject', он вернет его, будет ли он« null »или нет. Если его нет, он выкинет «RuntimeBinderException». Он не будет вызывать 'ArgumentNullException', поэтому в вашем коде должна быть некоторая ошибка. Не могли бы вы показать нам код, который бросает? – svick

+0

ОК, я думаю, меня просто обманывает окно просмотра Visual Studio. Код бросает ArgumentNullException, потому что значение на самом деле является нулевым, а не потому, что свойство «отсутствует». Когда я устанавливаю часы в динамической ссылке, он не отображает свойство, если оно имеет нулевое значение. Если я поставлю часы на ссылку ExpandoObject на тот же объект, он отобразит имя свойства в базовом списке ключей. –

ответ

3

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

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

Отлично! Это позаботилось об этом. –