So erhalten Sie einen Eigenschaftswert basierend auf dem Namen

147

Gibt es eine Möglichkeit, den Wert einer Eigenschaft eines Objekts anhand seines Namens zu ermitteln?

Zum Beispiel, wenn ich habe:

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

und

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

Ich möchte eine Methode schreiben, bei der ich den Eigenschaftsnamen übergeben kann und die den Eigenschaftswert zurückgibt. dh:

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

Antworten:

310
return car.GetType().GetProperty(propertyName).GetValue(car, null);
Matt Greer
quelle
17
Denken Sie daran, dass dies viel langsamer ist, da hier Reflexion verwendet wird. Wahrscheinlich kein Problem, aber gut zu wissen.
Matt Greer
"Kann nicht von String zu BindingFlags konvertieren"
Christine
5
Gibt es einen "schnelleren" Weg @MattGreer?
FizxMike
44

Sie müssten Reflexion verwenden

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

Wenn Sie wirklich ausgefallen sein möchten, können Sie es zu einer Erweiterungsmethode machen:

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

Und dann:

string makeValue = (string)car.GetPropertyValue("Make");
Adam Rackis
quelle
Sie möchten GetValue anstelle von SetValue
Matt Greer
kann ich das auch für einen SetValue machen? Wie?
Piero Alberto
1
Neben-Ding-Erweiterungsmethode muss wahrscheinlich nicht die Variable benannt habencar
KyleMit
Informationen
35

Du willst Reflexion

Type t = typeof(Car);
PropertyInfo prop = t.GetProperty("Make");
if(null != prop)
return prop.GetValue(this, null);
Chuck Savage
quelle
7
+1 Dies ist die beste Antwort, da Sie alle Zwischenobjekte anzeigen
Matt Greer
1
Kann ich anstelle der Übergabe des Eigenschaftswerts den Index übergeben und den Eigenschaftsnamen und -wert abrufen (damit ich die gesamte Eigenschaft durchlaufen kann)?
singhswat
@singhswat Das solltest du als neue Frage stellen.
Chuck Savage
7

Einfaches Beispiel (ohne Schreibreflexions-Hardcode im 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
quelle
7

Darüber hinaus antworten andere Leute: Es ist einfach, den Eigenschaftswert eines Objekts mithilfe der Erweiterungsmethode zu ermitteln, z. B.:

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

    }

Verwendung ist:

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

Erweitern Sie die Antwort von Adam Rackis - wir können die Erweiterungsmethode einfach so generisch gestalten:

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

Wenn Sie möchten, können Sie auch Fehler behandeln.

Cameron vorwärts
quelle
1

Um Reflexionen zu vermeiden, können Sie ein Wörterbuch mit Ihren Eigenschaftsnamen als Schlüssel und Funktionen im Wörterbuchwertteil einrichten, die die entsprechenden Werte aus den von Ihnen angeforderten Eigenschaften zurückgeben.

Paul McCarthy
quelle