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í:
- Equivalente programático del valor predeterminado (Tipo) 12 respuestas
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.