Pregunta

Tengo dos clases.

public class Class1 {
   public string value {get;set;}
}

public class Class2 {
   public Class1 myClass1Object {get;set;}
}

Tengo un objeto de tipo Class2. Necesito usar la reflexión en Clase 2 para establecer la propiedad de valor ... es decir, si lo estuviera haciendo sin reflexión, así es como lo haría:

Class2 myObject = new Class2();
myObject.myClass1Object.value = "some value";

¿Hay alguna forma de hacer lo anterior, mientras se usa la reflexión para acceder a la propiedad " myClass1Object.value " ?

Gracias de antemano.

¿Fue útil?

Solución

Básicamente dividirlo en dos accesos de propiedad. Primero, obtienes la propiedad myClass1Object , luego, configuras la propiedad value en el resultado.

Obviamente, deberá tomar el formato del nombre de la propiedad y dividirlo, por ejemplo. por puntos. Por ejemplo, esto debería hacer una profundidad arbitraria de propiedades:

public void SetProperty(object source, string property, object target)
{
    string[] bits = property.Split('.');
    for (int i=0; i < bits.Length - 1; i++)
    {
         PropertyInfo prop = source.GetType().GetProperty(bits[i]);
         source = prop.GetValue(source, null);
    }
    PropertyInfo propertyToSet = source.GetType()
                                       .GetProperty(bits[bits.Length-1]);
    propertyToSet.SetValue(source, target, null);
}

Es cierto que probablemente querrás un poco más de comprobación de errores que eso :)

Otros consejos

Estaba buscando respuestas al caso donde obtener un valor de propiedad, cuando se da el nombre de la propiedad, pero no se conoce el nivel de anidación de la propiedad.

Por ej. si la entrada es " valor " en lugar de proporcionar un nombre de propiedad completamente calificado como " myClass1Object.value " ;.

Sus respuestas inspiraron mi solución recursiva a continuación:

public static object GetPropertyValue(object source, string property)
{
    PropertyInfo prop = source.GetType().GetProperty(property);
    if(prop == null)
    {
      foreach(PropertyInfo propertyMember in source.GetType().GetProperties())
      { 
         object newSource = propertyMember.GetValue(source, null);
         return GetPropertyValue(newSource, property);
      }
    }
    else
    {
       return prop.GetValue(source,null);
    }
    return null;
}
   public static object GetNestedPropertyValue(object source, string property)
    {
        PropertyInfo prop = null;
        string[] props = property.Split('.');

        for (int i = 0; i < props.Length; i++)
        {
            prop = source.GetType().GetProperty(props[i]);
            source = prop.GetValue(source, null);
        }
        return source;
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top