Tuve que hacer la conversión inversa opuesta (de cadena a tipo) como parte de un serializador que quería escribir (evitando el construido en uno, por Razones). Estaba haciendo la deserialización y esta fue la única publicación para hablar al respecto, así que estoy actualizando con mi respuesta cuando todavía está fresca.
El método que utilicé fue utilizar la reflexión para básicamente resolver lo que tenía que hacer. El tipo de variable en el siguiente ejemplo es el objeto Type del tipo al que estoy convirtiendo, E es un XmlNode cuyo contenido voy a convertir y newVar es una instancia de una plantilla tipo T que devolveré. Este fragmento no asume ninguna fuerza sobre T (que es por qué no hay cadena de asignación/cast directa) y asume objetos/enumeraciones se manejan de forma diferente (objetos y enumeraciones romper este):
MethodInfo convertMethod;
if(Type.GetTypeCode(type) != TypeCode.String)
convertMethod = typeof(XmlConvert).GetMethod ("To" + type.Name);
else
convertMethod = E.InnerText.GetType().GetMethod("Clone");
if(convertMethod == null)
{
//Error
}
else
{
if(Type.GetTypeCode (type)!= TypeCode.String)
newVar = (T)convertMethod.Invoke(null, new object[] { E.InnerText });
else
newVar = (T)convertMethod.Invoke (E.InnerText, new object[]{});
}
(Cadena precisa ser tratada como un caso especial como ToString() hace algo completamente diferente y lo rompe todo).
El revés (como en el post original) sería algo así (no probado, se actualizará si escribo la función serialize):
MethodInfo convertMethod;
if(Type.GetTypeCode(type) != TypeCode.String)
convertMethod = typeof(XmlConvert).GetMethod ("ToString", new Type[] {typeof(T)});
else
convertMethod = typeof(string).GetMethod("Clone");
if(convertMethod == null)
{
//Error
}
else
{
string str;
if(Type.GetTypeCode (type)!= TypeCode.String)
str = (string)convertMethod.Invoke(null, new object[] { Value });
else
str = (string)convertMethod.Invoke (Value, new object[]{});
}
En este caso, la conversión es de T a cuerda y Value contiene un tipo T del que estamos convirtiendo. La diferencia es que pedimos ToString pero especificamos la función con un parámetro de tipo T. Esto debería ser lo suficientemente único.
Aprecio la información, pero he pasado por XmlSerializer, DataContractSerializer hell. Incluso he jugado con XamlWriter. Mis valores están encasillados porque los estoy accediendo a través de una interfaz que trata con muchos tipos de datos. –