2010-02-16 45 views
1

一些代码:如何获取对象属性的默认值?

foreach (System.Reflection.PropertyInfo pi in myObject.GetType().GetProperties()) 
{ 
    if (pi.CanWrite) 
    { 
     object value = pi.GetValue(Properties, null); 

     // if (value is not default) 
     // { 
     X.addAttribute(pi.Name, value); 
     // } 
    } 
} 

我试图做的是拒收行“X.addAttribute ......”如果房产是在其默认值。我假设有一些方法可以获得属性的DefaultValue,所以我可以做一个比较?

为了我的目的,我试图获得由DefaultValueAttribute定义的'default'值。

任何帮助表示赞赏,欢呼声。

+0

答案将取决于您如何定义“默认值”。两个明显的定义是CLR默认值(对于引用类型为“null”,对于值类型为0)或“DefaultValueAttribute”。你能编辑你的问题来澄清你感兴趣吗? –

+0

嗨,道歉;我应该指定。它是通过DefaultValueAttribute定义的默认值。 – Wex

回答

3

假设你正在试图获得的默认值属性,使用您PropertyInfo对象GetCustomAttributes

+0

干杯。这是我需要的信息,用于我的目的。 – Wex

-3

首先,您必须始终使用您想要的值初始化该字段作为默认值。

类似

class UnitManager 
    { 
     private int value; 

     [DefaultValue("0")] 
     public int Value 
     { 
     get { return this.value; } 
     set { this.value = value; } 
     } 
    } 

然后只需使用

UnitManager manager = new UnitManager() 

    int startValue = manager.Value; 
4

以下是我用来获取任何默认值的方法运行时类型它将为非值类型返回'null',否则它将返回默认值类型(它包括缓存额外的值的值类型):

private static readonly Dictionary<Type, object> DefaultValueTypes 
    = new Dictionary<Type, object>(); 

public static object GetDefaultValue(Type type) 
{ 
    if (!type.IsValueType) return null; 

    object defaultValue; 
    lock (DefaultValueTypes) 
    { 
     if (!DefaultValueTypes.TryGetValue(type, out defaultValue)) 
     { 
      defaultValue = Activator.CreateInstance(type); 
      DefaultValueTypes[type] = defaultValue; 
     } 
    } 

    return defaultValue; 
} 
+0

谢谢,但我的系统使用了一些非价值类型。无论如何,这是一个方便的代码:)。 – Wex

+0

或者,如果类型在编译时已知,则可以使用'default'关键字。 –

+0

这就是我想要的!谢谢! –