Pergunta

Eu tenho duas classes.

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

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

Eu tenho um objeto do tipo Class2. Eu preciso usar reflexão sobre Class2 para definir a propriedade valor ... isto é, se eu estivesse fazendo isso sem reflexão, este é como eu iria sobre isso:

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

Existe uma maneira de fazer o acima, ao usar o reflexo para acessar a propriedade "myClass1Object.value"?

Agradecemos antecipadamente.

Foi útil?

Solução

Basicamente dividi-lo em dois acessos de propriedade. Primeiro você get propriedade myClass1Object, então você set propriedade value no resultado.

Obviamente você vai precisar de tomar qualquer formato que você tem o nome da propriedade e dividi-lo fora - por exemplo, por pontos. Por exemplo, isso deve fazer uma profundidade arbitrária de propriedades:

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);
}

É verdade que você provavelmente vai querer um pouco mais a verificação de erros do que isso:)

Outras dicas

Eu estava procurando por respostas para o caso onde obter um valor de propriedade, quando o nome da propriedade é dado, mas o nível de aninhamento da propriedade não é conhecido.

Por exemplo. se a entrada for "valor" em vez de fornecer um nome de propriedade totalmente qualificado como "myClass1Object.value".

As suas respostas inspirou a minha solução recursiva abaixo:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top