2013-02-11 50 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)此外,您的代码缺少右括号和分号。 – 2013-02-11 20:11:02

+0

我假设你期望一个非值类型的默认值为null? – rene 2013-02-11 20:13:17

+0

除非你没有其他好的选择,否则你应该避免使用“动态”。使用'var'或'object'作为'value'的类型在这里可以很好地工作。 – Bobson 2013-02-11 20:15:12

回答

2

==对于object将始终表示:引用相等。对于参考,默认总是null,所以如果!prop.PropertyType.IsValueType,那么你只需要一个null检查。对于价值型,你将拳击。因此,参考平等将始终报告,除非它们都是Nullable<T>对于某些T,并且都是空的。但是,要获得“默认”值类型(prop.PropertyType.IsValueType),可以使用Activator.CreateInstance(prop.PropertyType)。请记住==而不是要去做你想要的东西。 Equals(x,y)可能工作得更好。

+0

谢谢。我总是忘记==作为参考平等。也许这是最后一次。 – Thinmint 2013-02-11 20:50:26

0

你可以做到这一点,你不能依靠==运算符来完成这项工作。你会想使用.Equals或object.ReferenceEquals来做比较。