Usando la reflexión para establecer una propiedad de una propiedad de un objeto
-
05-07-2019 - |
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.
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;
}