2009-09-23 21 views
7

que tienen este documento XMLcómo emitir dinámicamente un objeto de tipo string a un objeto de tipo T

<AdditionalParameters> 
<PublishToPdf Type ="System.Boolean">False</PublishToPdf> 
</AdditionalParameters> 

en mi código y yo estoy tratando de construir una serie de argumentos que contienen el nodo <PublishToPdf>.

object test = (object) ((typeof(publishNode.Attributes["Type"].value)) publishNode.InnerText); 

Esto se rompe en tiempo de compilación, por supuesto. No puedo encontrar la forma de convertir el publishNode.InnerText('false') en un objeto de tipo definido en el tiempo de ejecución especificado en el archivo XML y almacenarlo en un objeto (que conservará el tipo).

Respuesta

19

Puede utilizar Convert.ChangeType:

object value = Convert.ChangeType(stringValue, destinationType); 
+0

Muchas gracias, funcionó bien. – LolaRun

+0

Sí, y para obtener destinationType, use var destinationType = Type.Parse (publishNode.Attributes ["Type"]. Value); – Digitalex

+0

Type.Parse() no parece existir. ¿Querías decir Type.GetType() por casualidad? –

2

No puede hacer exactamente lo que está tratando de hacer. En primer lugar, la palabra clave typeof no permite la evaluación dinámica en tiempo de ejecución. Hay medios para hacerlo mediante la reflexión, con métodos como Type.GetType(string), pero los objetos Type devueltos de estas funciones reflexivas no se pueden usar para operaciones como la fundición.

Lo que debe hacer es proporcionar un medio para convertir su tipo hacia y desde una representación de cadena. No hay conversión automática de ningún tipo arbitrario. Para su ejemplo, puede usar bool.Parse o bool.TryParse, pero esos son específicos para el tipo bool. Hay métodos similares en la mayoría de los tipos primitivos.

+0

Pasar por la cuerda me fue el truco. – Slion

1

La solución simple, suponiendo que hay un número limitado de tipos posibles;

object GetValueObject(string type, string value) 
{ 
    switch (type) 
    { 
    case "System.Boolean": 
     return Boolean.Parse(value); 
    case "System.Int32": 
     return Int32.Parse(value); 
    ... 
    default: 
     return value; 
    } 
} 

var type = publishNode.Attributes["Type"].value; 
var value = publishNode.InnerText; 
var valueObject = GetValueObject(type, value); 
+0

estoy trabajando con .NET Framework 2.0. y no tengo var. Y la solución que sugirió es la fábrica que implementa la creación de objetos de todo tipo, que son innumerables. Pero gracias por su ayuda de todos modos. – LolaRun

+0

Bueno, la var era solo para acortar el código, puedes usar cadena, cadena, objeto para estos tres en su lugar. Y, como dije, si solo necesita admitir un número limitado de tipos, esto funcionaría bien. Si no, entonces tienes razón al decir que no es práctico. – Digitalex

+1

Con C# 6 puede usar 'case nameof (System.Guid):' por ejemplo. Ya no es necesario para const cuerdas. nameof es el tiempo de compilación generado. –

Cuestiones relacionadas