Come ottenere un valore di proprietà basato sul nome


148

c'è un modo per ottenere il valore di una proprietà di un oggetto in base al suo nome?

Ad esempio se ho:

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

e

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

Voglio scrivere un metodo in cui posso passare il nome della proprietà e restituirebbe il valore della proprietà. vale a dire:

public string GetPropertyValue(string propertyName)
{
   return the value of the property;
}

Risposte:


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

17
Tieni presente che poiché utilizza la riflessione, è molto più lento. Probabilmente non è un problema, ma è bene esserne consapevoli.
Matt Greer

"Impossibile convertire da String a BindingFlags"
Christine,

5
C'è un modo "più veloce" @MattGreer?
FizxMike

44

Dovresti usare la riflessione

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

Se vuoi essere davvero fantasioso, potresti renderlo un metodo di estensione:

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

E poi:

string makeValue = (string)car.GetPropertyValue("Make");

Vorresti GetValue invece di SetValue
Matt Greer

posso farlo anche per un SetValue? Come?
Piero Alberto,

1
il metodo di estensione delle cose minori probabilmente non ha bisogno di avere la variabile chiamatacar
KyleMit

Per vedere come impostare il valore della proprietà, basato su una stringa propertyName, vedere la risposta qui: Impostazione del valore delle proprietà tramite reflection
nwsmith

35

Vuoi la riflessione

Type t = typeof(Car);
PropertyInfo prop = t.GetProperty("Make");
if(null != prop)
return prop.GetValue(this, null);

7
+1 Questa è la risposta migliore mentre mostri tutti gli oggetti intermedi
Matt Greer

1
Invece di passare il valore della proprietà, posso passare l'indice e ottenere il nome e il valore della proprietà (in modo da poter passare in rassegna tutta la proprietà)?
singhswat,

@singhswat Dovresti porlo come una nuova domanda.
Chuck Savage,

7

Esempio semplice (senza scrivere codice di riflessione riflessa nel 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

Inoltre, altri ragazzi rispondono, è facile ottenere il valore della proprietà di qualsiasi oggetto usando il metodo Extension come:

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'utilizzo è:

Car foo = new Car();
var balbal = foo.GetPropertyValue("Make");

7

Espandendo la risposta di Adam Rackis, possiamo rendere generico il metodo di estensione semplicemente in questo modo:

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

Se lo desideri, puoi anche evitare di gestire alcuni errori.


1

Per evitare la riflessione, è possibile impostare un dizionario con i propri nomi come chiavi e funzioni nella parte del valore del dizionario che restituisce i valori corrispondenti dalle proprietà richieste.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.