(SOLUCIONADO) Estoy construyendo una aplicación que puede crear parte de su control de forma dinámica, basándose en alguna descripción del archivo XML.
Lo que necesito ahora es algo muy similar al método TryParse(): una posibilidad de verificar (sin lanzar/atrapar excepciones), si un texto en una variable de cadena se puede convertir (o analizar) a un tipo, el nombre que tengo otra variabe (myType
).
problema es que myType
puede ser cualquiera de los tipos de .NET: DateTime, Bool, Double, Int32
etc.Prueba si la cadena se puede convertir a otra, varios tipos
Ejemplo:
string testStringOk = "123";
string testStringWrong = "hello";
string myType = "System.Int32";
bool test1 = CanCovertTo(testStringOk, myType); //true
bool test2 = CanCovertTo(testStringWrong, myType); //false
¿Cómo CanCovertTo(string testString, string testType)
función debe ser similar?
Lo más cerca que consigo es siguiente código:
private bool CanCovertTo(string testString, string testType)
{
Type type = Type.GetType(testType, null, null);
TypeConverter converter = TypeDescriptor.GetConverter(type);
converter.ConvertFrom(testString); //throws exception when wrong type
return true;
}
sin embargo, se produce una excepción al intentar convertir de cadena mal, y yo prefiero no utilizar try {} catch()
para eso.
Solución:
private bool CanCovertTo(string testString, string testType)
{
Type type = Type.GetType(testType, null, null);
TypeConverter converter = TypeDescriptor.GetConverter(type);
return converter.IsValid(testString);
}
¿Por qué prefieres no usar try/catch para eso? – PVitt
¿Por qué intenta convertir un valor en una función que se llama CanConvert? ¿No puede simplemente hacer "devolver convertidor.CanConvertFrom (typeof (cadena))" – Grrbrr404
@PVitt: se trata simplemente de "mejores prácticas", he leído que debe evitar trabajar con excepciones con acciones normales del programa. Creo que es por eso que el método TryParse() existe junto con Parse(). Honestamente, si hay un método mejor que este, que me permite hacer lo que necesito, prefiero ese. :) – mj82