2013-02-11 3 views
0

Я использую отражение, чтобы получить все свойства объекта. Затем мне нужно выяснить, является ли какое-либо из значений этого свойства значением по умолчанию любого типа, которым они являются. Ниже мой текущий код. Он жалуется, что пространство имен или тип не удалось найти. Это заставляет меня думать, что это имеет какое-то отношение к тому, как C# подразумевает принудительное принуждение типа. Поскольку я захватываю тип во время выполнения, он не знает, как его сравнивать или что-то не совсем понятно.Получение значения неизвестного типа во время выполнения

Я надеялся избежать случая переключения, сравнивая имя типа, которое приходит, но прямо сейчас, которое выглядит как мой единственный вариант, если только блестящие люди из StackOverflow не приведут меня в правильном направлении.

private bool testPropertyAttribute(PropertyInfo prop) 
    { 
     dynamic value = prop.GetValue(DataObject, null); 
     Type type = prop.PropertyType; 

     /* Test to see if the value is the defult of its type */ 
     return (value == default(prop.PropertyType) 

    } 
+0

['default' работает только с общими параметрами.] (Http://msdn.microsoft.com/en-us/library/xwth0h0d.aspx) Кроме того, в вашем коде отсутствует закрывающая скобка и точка с запятой. –

+0

Предполагаю, что вы ожидаете, что значение по умолчанию не имеет значение null? – rene

+0

Вам следует избегать «динамического», если у вас нет другого хорошего выбора. Использование 'var' или' object' в качестве типа 'value' будет работать отлично. – Bobson

ответ

2

== для object всегда будет означать: ссылку равенства. Для справки по умолчанию всегда null, поэтому, если !prop.PropertyType.IsValueType, вам понадобится только null. Для значений типов, вы будете боксировать. Поэтому ссылочное равенство всегда будет сообщать false, если только они не являются Nullable<T> для некоторых T, и оба они пустые. Однако, чтобы получить тип значения по умолчанию (prop.PropertyType.IsValueType), вы можете использовать Activator.CreateInstance(prop.PropertyType). Просто имейте в виду, что == is не будет делать то, что вы хотите здесь. Equals(x,y)способ доставки работа лучше.

+0

Спасибо. Я всегда забываю о том, что == является ссылочным равенством. Возможно, это был последний раз. – Thinmint

0

Вы можете сделать это, просто не можете полагаться на оператор == для выполнения работы. Вы хотите использовать .Equals или object.ReferenceEquals для сравнения.

Смежные вопросы