Comment obtenir une valeur de propriété en fonction du nom

148

existe-t-il un moyen d'obtenir la valeur d'une propriété d'un objet en fonction de son nom?

Par exemple si j'ai:

public class Car : Vehicle
{
   public string Make { get; set; }
}

et

var car = new Car { Make="Ford" };

Je veux écrire une méthode dans laquelle je peux passer le nom de la propriété et renvoyer la valeur de la propriété. c'est à dire:

public string GetPropertyValue(string propertyName)
{
   return the value of the property;
}
Codeur 2
la source

Réponses:

311
return car.GetType().GetProperty(propertyName).GetValue(car, null);
Matt Greer
la source
17
Gardez à l'esprit que puisque cela utilise la réflexion, il est beaucoup plus lent. Probablement pas un problème, mais il est bon d'en être conscient.
Matt Greer
"Impossible de convertir une chaîne en BindingFlags"
Christine
5
Existe-t-il un moyen "plus rapide" @MattGreer?
FizxMike
44

Tu devrais utiliser la réflexion

public object GetPropertyValue(object car, string propertyName)
{
   return car.GetType().GetProperties()
      .Single(pi => pi.Name == propertyName)
      .GetValue(car, null);
}

Si vous voulez être vraiment sophistiqué, vous pouvez en faire une méthode d'extension:

public static object GetPropertyValue(this object car, string propertyName)
{
   return car.GetType().GetProperties()
      .Single(pi => pi.Name == propertyName)
      .GetValue(car, null);
}

Puis:

string makeValue = (string)car.GetPropertyValue("Make");
Adam Rackis
la source
Vous voudriez GetValue au lieu de SetValue
Matt Greer
puis-je faire cela aussi pour un SetValue? Comment?
Piero Alberto
1
chose mineure - la méthode d'extension n'a probablement pas besoin d'avoir la variable nomméecar
KyleMit
Pour voir comment définir la valeur de la propriété, en fonction d'une chaîne propertyName, consultez la réponse ici: Définition de la valeur des propriétés via la réflexion
nwsmith
35

Vous voulez de la réflexion

Type t = typeof(Car);
PropertyInfo prop = t.GetProperty("Make");
if(null != prop)
return prop.GetValue(this, null);
Chuck Savage
la source
7
+1 C'est la meilleure réponse car vous montrez tous les objets intermédiaires
Matt Greer
1
Au lieu de passer la valeur de la propriété, puis-je passer l'index et obtenir le nom et la valeur de la propriété (pour pouvoir parcourir toute la propriété)?
singhswat
@singhswat Vous devriez poser cela comme une nouvelle question.
Chuck Savage
7

Exemple simple (sans code dur de réflexion d'écriture dans le client)

class Customer
{
    public string CustomerName { get; set; }
    public string Address { get; set; }
    // approach here
    public string GetPropertyValue(string propertyName)
    {
        try
        {
            return this.GetType().GetProperty(propertyName).GetValue(this, null) as string;
        }
        catch { return null; }
    }
}
//use sample
static void Main(string[] args)
    {
        var customer = new Customer { CustomerName = "Harvey Triana", Address = "Something..." };
        Console.WriteLine(customer.GetPropertyValue("CustomerName"));
    }
Harveyt
la source
7

En outre, d'autres types répondent, il est facile d'obtenir la valeur de propriété de n'importe quel objet en utilisant une méthode d'extension comme:

public static class Helper
    {
        public static object GetPropertyValue(this object T, string PropName)
        {
            return T.GetType().GetProperty(PropName) == null ? null : T.GetType().GetProperty(PropName).GetValue(T, null);
        }

    }

L'utilisation est:

Car foo = new Car();
var balbal = foo.GetPropertyValue("Make");
Ali
la source
7

En développant la réponse d'Adam Rackis - nous pouvons rendre la méthode d'extension générique simplement comme ceci:

public static TResult GetPropertyValue<TResult>(this object t, string propertyName)
{
    object val = t.GetType().GetProperties().Single(pi => pi.Name == propertyName).GetValue(t, null);
    return (TResult)val;
}

Vous pouvez également lancer une gestion des erreurs si vous le souhaitez.

Cameron Attaquant
la source
1

Pour éviter toute réflexion, vous pouvez configurer un dictionnaire avec vos noms de propriétés sous forme de clés et de fonctions dans la partie valeur du dictionnaire qui renvoient les valeurs correspondantes à partir des propriétés que vous demandez.

Paul McCarthy
la source