views:

251

answers:

3

Some code:

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

What I'm trying to do is not-call the line 'X.addAttribute...' if the property is at its DefaultValue. I assume there's some way of getting the DefaultValue of a property so I can do a comparison?

For my purpose I am trying to get the 'default' value as defined by DefaultValueAttribute.

Any help is appreciated, cheers.

A: 

First, You must always initialize the field with value you want as a default.

Something similar

    class UnitManager
    {
      private int value;

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

Then simply use

    UnitManager manager = new UnitManager()

    int startValue = manager.Value;
Asad Butt
+2  A: 

Assuming you're trying to get the DefaultValue attribute, use GetCustomAttributes on your PropertyInfo objects.

Sylvestre Equy
Cheers. This is the bit of info I needed for my purpose.
Wex
+1  A: 

Below is the method I use to get a default value of any runtime-type it will return 'null' for non value types otherwise it will return the default value type (it includes caching of value types for extra perf):

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;
}
mythz
Thanks, but my system uses some non-value types. This is a handy bit of code to have anyway :).
Wex
Alternatively, if the type is known at compile-time, the `default` keyword can be used.
Programming Hero