Default Value

May 11, 2010

In .NET we’ve got this cool little language construct called default, that’ll give you the default value for any given type.  That is, null, for any reference type, or zero/false/DateTime.Min/etc. for value types.

Here it is in action (nothing amazing going on here):

var x =default(DateTime);

So what if you don’t know the type you want the default of at compile time? You can’t say

var y =default(today.GetType());

nor

var z =typeof(DateTime).GetDefault();

That last one would be nice, but that “GetDefault” method doesn’t exist.

I’ve seen several solutions to this, that are basically variations on this theme:

publicstaticobject GetDefaultValue(Type type)

{

    return type.IsValueType

        ?Activator.CreateInstance(type)

: null;

}

This certainly works, but I somehow feel like it’s not exactly perfect since it doesn’t use the *default *operator.

Here is how I normally do it.  It sidesteps the IsValueType, and Activator stuff, and uses the built-in default language construct… First it grabs a handle to the GetDefaultGeneric method, and then makes the generic version of it with the specific type.  Then it calls it, returning the value.

publicstaticobject GetDefault(thisType type)

{

    var getDefault =typeof(ExtReflection)

                         .GetMethod("GetDefaultGeneric");

    var typed = getDefault.MakeGenericMethod(type);

   

    return typed.Invoke(null, newobject[] { });

}

publicstatic T GetDefaultGeneric<T>()

{

  returndefault(T);

}

Pretty simple, but something I’ve found useful every now and again.  I’d guess this technique could be useful in other situations/contexts as well.