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

Réponses:


311
return car.GetType().GetProperty(propertyName).GetValue(car, null);

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

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

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

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

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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.