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

Antworten:


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

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

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


35

Du willst Reflexion

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

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

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

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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.