J'accède la valeur de la propriété à partir d'un objet de classe au moment de l'exécution à l'aide de la réflexion en C #.
public bool GetValue(string fieldName, out object fieldValue) { // Get type of current record Type curentRecordType = _currentObject.GetType(); PropertyInfo property = curentRecordType.GetProperty(fieldName); if (property != null) { fieldValue = property.GetValue(_currentObject, null).ToString(); return true; } else { fieldValue = null; return false; } }
3 Réponses :
Obtenez l'objet enfant à l'aide de la réflexion, puis utilisez la réflexion pour obtenir la valeur de la même manière. P>
Voulez-vous dire en utilisant GetNeetetTypes ()?
public void Main(){ var containerObject = new ContainerObject(); object propertyValue; object nestedPropertyValue; if(GetValue(containerObject, "FirstPropertyName", out propertyValue){ bool success = GetValue(propertyValue, "NestedPropertyName", out nestedPropertyValue); } } public bool GetValue(object currentObject, string propertyName, out object propertyValue) { // Get type of current record var currentObjectType = currentObject.GetType(); PropertyInfo propertyInfo = currentObjectType.GetProperty(propertyName); propertyValue = propertyInfo != null ? propertyInfo.GetValue(currentObject,null) : null; return propertyValue == null; }
Merci SmartCaveman, mais je ne suis pas à l'avance, ce que la propriété particulière de l'objet principal sera parent pour la propriété imbriquée. Dans ce cas, votre extrait de code ne résoudra pas mon problème.
Vous pouvez obtenir toutes les propriétés en utilisant getProperties au lieu de getProperty (nom). Je pourrais vous aider davantage si vous souhaitez spécifier davantage l'objectif.
Étant donné que vous souhaitez pouvoir trouver des objets sur des objets enfants non imbriqués arbitrairement, vous avez besoin d'une fonction que vous pouvez appeler de manière récursive. Ceci est compliqué par le fait que vous avez peut-être des enfants qui renvoient à leur parent, vous devez donc garder une trace de quels objets que vous avez vus auparavant dans votre recherche.
public bool GetValue(string pathName, out object fieldValue) { object currentObject = _currentObject; string[] fieldNames = pathName.Split("."); foreach (string fieldName in fieldNames) { // Get type of current record Type curentRecordType = currentObject.GetType(); PropertyInfo property = curentRecordType.GetProperty(fieldName); if (property != null) { currentObject = property.GetValue(currentObject, null).ToString(); } else { fieldValue = null; return false; } } fieldValue = currentObject; return true; }
Donner le nom du chemin de chaque propriété n'est pas possible dans mon cas car il y a des centaines de propriétés. Voulez-vous une manière courte et efficace où mon code peut descendre à l'objet enfant et récupérer la valeur de la propriété donnant uniquement l'objet parent et le nom de la propriété comme entrée.
Vous dites donc que vous avez un arbre d'objets où chaque propriété parmi tous les objets a un nom unique et que vous souhaitez pouvoir trouver une propriété arbitraire imbriquée donnée uniquement son nom? (Si vous avez FOO.BAR.BAZ.QUX, vous voulez simplement passer à "qux" et que la fonction montre que c'est dans `foo.bar.baz ')
Inutan: Cela complique considérablement les choses. Voir ma fonction révisée.
Merci gabe. Pourriez-vous s'il vous plaît ajoutez votre fonction précédente lorsque le nom de passage de passage pour chaque propriété comme paramètre ... peut avoir besoin de cela.
Inutan: Ok, je mets l'ancienne retour dans la nouvelle façon.
Merci Gabe, seul changement que j'ai fabriqué était de retirer 'Tostring ()' dans CurrentObject = Property.gevalue (CurrentObject, NULL) .Tostring ();
Vous n'avez pas à utiliser de la récursion. Vous pourriez pousser des objets sur une pile et déclarer la victoire quand ils ont tous été sautés. C'est un peu plus difficile à lire, mais il court plus vite.
Avez-vous un problème ou y a-t-il une autre question ici?
Edité ma question, besoin d'un moyen d'accéder à la valeur de la propriété de l'objet enfant.