2011-10-27 32 views
11

Tengo un método genérico que convierte una identificación de una cadena (por ejemplo, recuperada del valor de un HiddenField en un formulario ASP.NET) en un destino escriba y haga algo con eso.Convertir valor de la cadena al tipo genérico que es Guid o int

private void MyMethod<T>(string rawId, Action<T> doSomethingWithId) 
{ 
    T id = (T)Convert.ChangeType(rawId, typeof(T)); 
    doSomethingWithId(id); 
} 

T será un GUID o Int32 y el código anterior se cae (en tiempo de ejecución) cuando es Guid, diciendo que el elenco de String a Guid es válido.

Entonces pensé que podría tratar de comprobar el tipo y si Guid, una instancia de un nuevo GUID:

var id = default(T); 
if (id is Guid) 
    id = new Guid(rawId); 
else 
    id = (T)Convert.ChangeType(rawId, typeof(T)); 

ahora esto da un error (en tiempo de compilación) que Guid no se puede convertir a tipo T

No estoy seguro de cómo evitar esto. ¿Alguna sugerencia?

Respuesta

21

el siguiente código funciona bien con la conversión a Guid. comprobar que

id = (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(text); 
4

Si T o habrá Guid o Int32 entonces no es realmente muy genérico, ¿verdad? Simplemente escriba dos métodos en su lugar, ya sea con diferentes nombres, o posiblemente sobrecargas. No veo el beneficio en el uso de genéricos aquí, y puede hacer que su código sea más complicado de lo necesario.

+0

Tienes razón, pero esto es un poco de un ejemplo inventado, hay más a ese método y lo hace de simplificar las cosas en el contexto más amplio de lo que yo 'Estoy haciendo. –

+0

@Veli: Por eso vale la pena tener cuidado al escribir una pregunta y dar una imagen representativa. Todavía consideraría dividirlo en dos métodos públicos no genéricos que podrían usar un método privado genérico común como * parte * de la implementación. –

1

Usted puede intentar algo como esto quizá:

private void MyMethod<T>(string rawId, Action<T> doSomethingWithId) 
{ 
    T id = (T)Activator.CreateInstance(typeof(T), new object[] { rawId }); 
    doSomethingWithId(id); 
} 
Cuestiones relacionadas