2009-05-14 26 views
6

Estoy usando la reflexión para poblar las propiedades de un objeto.Establecer las propiedades de un objeto a través de la reflexión con diferentes propiedades tipos

Estas propiedades tienen diferentes tipos: Cadena, Nullable (doble) y Nullable (larga) (no sé cómo escapar de los corchetes angulares aquí ...). Los valores para estas propiedades provienen de un diccionario de pares (cadena, objeto).

Así, por ejemplo, mi clase tiene las siguientes propiedades:

string Description { get; set; } 
Nullable<long> Id { get; set; } 
Nullable<double> MaxPower { get; set; } 

(en realidad hay alrededor de una docena de propiedades) y el diccionario tendrán entradas como < "Descripción", "Una descripción">, < "Id", 123456>, < "MaxPower", 20000>

Ahora estoy usando algo así como lo siguiente para configurar los valores:

foreach (PropertyInfo info in this.GetType().GetProperties()) 
{ 
    if (info.CanRead) 
    { 
     object thisPropertyValue = dictionary[info.Name]; 

     if (thisPropertyValue != null && info.CanWrite) 
     { 
      Type propertyType = info.PropertyType; 

      if (propertyType == typeof(String)) 
      { 
       info.SetValue(this, Convert.ToString(thisPropertyValue), null); 
      } 
      else if (propertyType == typeof(Nullable<double>)) 
      { 
       info.SetValue(this, Convert.ToDouble(thisPropertyValue), null); 
      } 
      else if (propertyType == typeof(Nullable<long>)) 
      { 
       info.SetValue(this, Convert.ToInt64(thisPropertyValue), null); 
      } 
      else 
      { 
       throw new ApplicationException("Unexpected property type"); 
      } 
     } 
    } 
} 

Entonces la pregunta es: ¿realmente tengo que verificar el tipo de cada propiedad antes de asignar el valor? ¿Hay algo así como un elenco que pueda realizar para que al valor de la propiedad se le asigne el tipo de la propiedad correspondiente?

Idealmente me gustaría ser capaz de hacer algo como los siguientes (que ingenuamente pensé que podría haber funcionado):

  if (thisPropertyValue != null && info.CanWrite) 
     { 
      Type propertyType = info.PropertyType; 

      if (propertyType == typeof(String)) 
      { 
       info.SetValue(this, (propertyType)thisPropertyValue, null); 
      } 
     } 

Gracias, Stefano

Respuesta

10

Si los valores ya de son el tipo correcto, luego no: no tienes que hacer nada. Si podrían no ser adecuado (int vs flotador, etc.), el un enfoque simple podría ser:

(edición ajustado por los nulos)

Type propertyType = info.PropertyType; 
if (thisPropertyValue != null) 
{ 
    Type underlyingType = Nullable.GetUnderlyingType(propertyType); 
    thisPropertyValue = Convert.ChangeType(
     thisPropertyValue, underlyingType ?? propertyType); 
} 
info.SetValue(this, thisPropertyValue, null); 
+0

que iba a sugerir tratando info.SetValue (esto, thisPropertyValue, null); pero esta parece ser una mejor solución. – ChrisF

+0

+1 para el método Convert.ChangeType. Es una gran solución para evitar los ifs en el código. –

+0

@Marc: Gracias, esto funcionó;) @ ChrisF: info.SetValue (this, thisPropertyValue, null) provocó una excepción al intentar convertir de int a double en uno de mis casos de prueba. –

Cuestiones relacionadas