Tengo una clase genérica que debe permitir cualquier tipo, primitivo o de otro tipo. El único problema con esto es usar default(T)
. Cuando llama por defecto a un tipo de valor o una cadena, lo inicializa a un valor razonable (como una cadena vacía). Cuando llama al default(T)
en un objeto, devuelve null. Por diversas razones, debemos asegurarnos de que si no es un tipo primitivo, tendremos una instancia predeterminada del tipo, , no nulo. Aquí es el intento 1:¿La mejor manera de probar si un tipo genérico es una cadena? (C#)
T createDefault()
{
if(typeof(T).IsValueType)
{
return default(T);
}
else
{
return Activator.CreateInstance<T>();
}
}
Problema - cadena no es un tipo de valor, pero no tiene un constructor sin parámetros. Entonces, la solución actual es:
T createDefault()
{
if(typeof(T).IsValueType || typeof(T).FullName == "System.String")
{
return default(T);
}
else
{
return Activator.CreateInstance<T>();
}
}
Pero esto se siente como un error. ¿Hay alguna manera más agradable de manejar la caja de cuerdas?
pensé Probé esa solución antes y no funcionó, pero debo haber hecho algo estúpido. Y gracias por señalar que el valor por defecto (cadena) arroja un valor nulo, todavía no hemos encontrado un error debido a eso, pero eso es cierto. –
@Matt Hamilton: +1, pero debe actualizar su respuesta para devolver '(T) (objeto) String.Empty' como lo sugiere CodeInChaos porque el tipo de devolución del método es genérico, no puede simplemente devolver una cadena. – VoodooChild
¿Qué pasa con la palabra clave 'is'? ¿No es de utilidad aquí? –