2011-03-09 11 views
8

ya descubrió que es posible establecer el valor de una propiedad utilizando la reflexión: Set object property using reflectionReflexión - establecer la propiedad objeto teniendo en cuenta el tipo de datos

Pero mi problema es que mis datos no existe más que como cadena. Por lo tanto, por supuesto, siempre recibo una excepción porque no es el tipo correcto.

¿Hay alguna forma de intentar automáticamente analizar la cadena según el tipo de letra (DateTime, int, decimal, float)?

A continuación se muestra el código que estoy usando:

Type myType = obj.GetType(); 
PropertyInfo[] props = myType.GetProperties(); 

foreach (PropertyInfo prop in props) 
{ 
    setProperty(obj, prop, data[prop.Name]); 
} 

data es un simple array asociativo que contiene los datos como una cadena. Se supone que estos datos están mapeados en obj.

Respuesta

15

Puede utilizar la clase Convert:

var value = Convert.ChangeType(data[prop.Name], prop.PropertyType); 
    setProperty(obj, prop, value); 
+0

¡Vaya, eso es realmente fácil! Gracias por tu ayuda. – Towa

0

Puede utilizar el TypeConverter class en System.ComponentModel:

foreach (PropertyInfo prop in props) 
{ 
    var value = data[prop.Name]; 
    prop.SetValue(obj, TypeConverter.ConvertTo(value, prop.PropertyType), null); 
} 
8

usted debería ser capaz de utilizar el TypeConverter:

var converter = TypeDescriptor.GetConverter(prop.PropertyType); 
var value = converter.ConvertFromString(data[prop.Name]); 
setProperty(obj,prop,value); 
0
PropertyInfo[] Properties = typeof(InvoiceLineItemSummary).GetProperties();  

      foreach (PropertyInfo objProperty in Properties) 
      { 
        if (columns.ConvertAll(column=>column.ToLower()).Contains(objProperty.Name.ToLower())) 
        { 
         if (Nullable.GetUnderlyingType(objProperty.PropertyType) != null) 
         { 
          if (Nullable.GetUnderlyingType(objProperty.PropertyType).ToString() == "System.Decimal") 
           vm.InvoiceLineItemSummaries.ToList().ForEach(val => val.GetType().GetProperty(objProperty.Name).SetValue(val, Math.Round(Convert.ToDecimal(val.GetType().GetProperty(objProperty.Name).GetValue(val, null)), 2), null)); 

         } 
         else if(objProperty.PropertyType.ToString() == "System.Decimal") 
          vm.InvoiceLineItemSummaries.ToList().ForEach(val => val.GetType().GetProperty(objProperty.Name).SetValue(val, Math.Round(Convert.ToDecimal(val.GetType().GetProperty(objProperty.Name).GetValue(val, null)), 2), null)); 
        } 
      } 


//vm.InvoiceLineItemSummary is List of classobject 
//InvoiceLineItemSummary is class 
Cuestiones relacionadas