visual valores valor tipos tablas tabla studio referencia presentacion para numericos implicitas formatos datos conversiones c# generics default

c# - valores - cómo obtener el valor predeterminado de un tipo si el tipo solo se conoce como Tipo de sistema?



tipos de datos en c# visual studio (3)

Esta pregunta ya tiene una respuesta aquí:

Si quiero un método que devuelve el valor predeterminado de un tipo determinado y el método es genérico, puedo devolver un valor predeterminado como ese:

public static T GetDefaultValue() { return default(T); }

¿Puedo hacer algo similar en caso de que tenga el tipo solo como un objeto System.Type ?

public static object GetDefaultValue(Type type) { //??? }


Así es como normalmente lo hago. Esto evita todo el ''IsValueType'' o la búsqueda de problemas de constructores por completo.

public static object MakeDefault(this Type type) { var makeDefault = typeof(ExtReflection).GetMethod("MakeDefaultGeneric"); var typed = makeDefault.MakeGenericMethod(type); return typed.Invoke(null, new object[] { }); } public static T MakeDefaultGeneric<T>() { return default(T); }


Como solo tiene que preocuparse por los tipos de valor (los tipos de referencia serán nulos), puede usar Activator.CreateInstance para llamar al constructor predeterminado.

public static object GetDefaultValue(Type type) { return type.IsValueType ? Activator.CreateInstance(type) : null; }

Editar: Jon es (por supuesto) correcto. IsClass no es lo suficientemente exhaustivo: devuelve False si type es una interfaz.


Sin un genérico, no puede garantizar que el tipo tenga un constructor sin parámetros, pero puede buscar uno utilizando la reflexión:

public static object GetDefaultValue(Type type) { ConstructorInfo ci = type.GetConstructor( new Type[] {} ); return ci.Invoke( new object[] {} ); }

Intenté esto en una aplicación de consola, y devuelve una instancia "predeterminada" de la clase, suponiendo que sea una clase. Si necesita que funcione también para los tipos de referencia, necesitará una técnica adicional.