2009-12-01 14 views
9

A juzgar por el título de esta pregunta, lo que quiero hacer puede no ser posible, así que describiré lo que estoy haciendo y puede dejarme saber lo que estoy haciendo Estoy haciendo mal y cuál sería una mejor manera de lograr mi objetivo.C# Tipo Casting en tiempo de ejecución usando Reflection

Tengo un archivo XML que describe 1) un objeto personalizado que se deriva de un tipo base, y 2) los nombres de los campos internos y los valores asociados. Estos objetos derivados pueden tener campos adicionales que la clase base no conoce.

Extraigo el tipo de objeto como una cadena y coloco todos los datos del objeto en un diccionario donde la clave es el nombre del campo y el valor es el valor del campo. Instancia el objeto utilizando el nombre de la cadena y el constructor predeterminado del objeto. Puedo olfatear todas las propiedades del objeto en PropertyInfo []. Ahora necesito tomar todos los valores que están en forma de cadena y convertirlos a los tipos de datos correctos para poder cargarlos en las propiedades del objeto. (A medida que escribo esto, parece que estoy tomando una especie de estado de guardado y restaurándolo, pero solo he oído hablar de este tipo de cosas. Si desea recomendar estas líneas, tenga en cuenta que estoy leyendo datos atascados desde un archivo XML y no puedo cambiar eso.)

que puede convertir todos los valores de cadena a un tipo determinado por un objetotipo y utilizando una función de fuerza bruta que hice que tiene la siguiente definición:

public object convertMe(string v, Type t) 

Ya que no saben lo que Tipo estoy tirando a la función, no sé lo que viene de vuelta y yo soy incapaz de convertir explícitamente el objeto al tipo adecuado para asignar a la propiedad antes mencionada. He estado tratando el siguiente tipo de moldes en vano:

string objectType = /*read type string from XML*/; 

... // Wherein I instantiate an object "theObject" and get PropertyInfo[] from it. 
... // I also make sure that I'm trying to assign the correct data to 
... // the correct property. 

Type t = currentProperty.PropertyType; 
object o = convertMe(value, Type.GetType(qtype)); 
currentProperty.SetValue(theObject, (t)o, null); // Doesn't work 
currentProperty.SetValue(theObject, (t)Convert.ChangeType(o, t), null); // Doesn't work. Apparently (t) is bad syntax. 

En última instancia, mi objetivo es crear una instancia del objeto y cargarlo con los datos del archivo XML de tal manera que los tipos de datos aren codificado La razón por la que estoy haciendo esto en C# es porque solía ser un programa de Python y me asignaron traducirlo a C# .NET 2.0. Es una experiencia de aprendizaje por decir lo menos. La razón por la que creé esa "función de fuerza bruta" es porque estaba buscando una forma de evitar este problema, pero no importa lo que intento, no puedo hacer que funcione. Probablemente podría hacer esto por mi cuenta usando pura fuerza, pero pensé que debía haber una solución elegante que me faltaba.

¡Cualquier ayuda es muy apreciada!

Respuesta

14

No necesita ningún molde en absoluto. PropertyInfo.SetValue toma un argumento del tipo object, así que simplemente pase o, y eso será todo.

+0

Bueno, llévame muerto. Voy a atribuir esto a la ceguera de código.Aunque los documentos de MSDN decían que se necesitaba un objeto, cada ejemplo que mostraba su uso utilizaba el tipo de valor adecuado, por lo que nunca hice esa conexión. ¡Muchas gracias! – Sanjamal

5

No necesita el reparto en absoluto. El lanzamiento solo es útil cuando intentas tratar con los objetos directamente, no cuando estás usando el reflejo.

Cuando vaya a establecer la propiedad, está usando PropertyInfo.SetValue. Esto toma un object como el parámetro de valor, por lo que no hay necesidad de tratar de forzar esto en el tipo específico (siempre y cuando el objeto ya sea del tipo correcto).

Dado que ya ha hecho un "convertMe" que coloca el objeto en el tipo correcto (fundido o encajonado en un Object), ya está todo listo, simplemente úselo.

+0

Muchas gracias a usted también! – Sanjamal

Cuestiones relacionadas