2009-09-09 5 views
4

J'ai deux classes.Utilisation de la réflexion pour définir une propriété d'une propriété d'un objet

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

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

J'ai un objet de type Class2. Je dois utiliser la réflexion sur Classe2 pour définir la propriété de valeur ... à savoir, si je devais le faire sans réflexion, voici comment j'aller à ce sujet:

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

est-il un moyen de faire ce qui précède, en utilisant la réflexion pour accéder à la propriété "myClass1Object.value"?

Merci d'avance.

+0

Ceci est tout à fait possible en utilisant la réflexion standard, bien que, sauf si vous avez des règles génériques, il semble que ce serait une logique unique qui pourrait être mieux accompli sans réflexion. –

+0

@Quintin Je me rends compte que mon exemple est un peu artificiel; Cependant, ma situation actuelle est en fait beaucoup plus complexe que l'exemple que j'ai posté et fait effectivement une réflexion à accomplir. – bugfixr

Répondre

11

Fondamentalement divisé en deux accès de propriété. D'abord vous obtenir la propriété myClass1Object, puis définir la propriété value sur le résultat.

De toute évidence, vous devrez prendre le format dans lequel vous avez entré le nom de la propriété et le diviser - par ex. par des points. Par exemple, cela devrait faire une profondeur arbitraire de propriétés:

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

Il est vrai que vous aurez probablement envie d'un peu plus de contrôle d'erreur que :)

+0

Très bien. Je me suis aventuré sur cette route en essayant d'obtenir le PropertyInfo de la première propriété, mais je suis tombé sur un mur quand j'ai essayé d'appeler SetValue parce que je n'avais pas la source (par exemple, vous avez fourni le GetValue) . Merci! – bugfixr

+0

Très utile! Merci! – Jagd

+0

Merci! J'ai eu une version récursive de ceci. Cette implémentation est bien meilleure: adoptée! – Larry

1

Je cherchais des réponses au cas où obtenir une valeur de propriété, lorsque le nom de propriété est donné, mais le niveau d'imbrication de la propriété n'est pas connu.

Par exemple. si l'entrée est "valeur" au lieu de fournir un nom de propriété qualifié complet comme "myClass1Object.value".

Vos réponses ont inspiré ma solution récursive ci-dessous:

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; 
} 
Questions connexes