384 Stimmen

Objekteigenschaft mit Reflexion festlegen

Gibt es eine Möglichkeit in C#, wo ich Reflexion verwenden können, um eine Objekteigenschaft festlegen?

Ex:

MyObject obj = new MyObject();
obj.Name = "Value";

Ich möchte die obj.Name mit Reflexion. So etwas wie:

Reflection.SetProperty(obj, "Name") = "Value";

Gibt es eine Möglichkeit, dies zu tun?

473voto

Andy Punkte 29060

Ja, Sie können die Type.InvokeMember() :

using System.Reflection;
MyObject obj = new MyObject();
obj.GetType().InvokeMember("Name",
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty,
    Type.DefaultBinder, obj, "Value");

Es wird eine Ausnahme ausgelöst, wenn obj hat keine Eigenschaft namens Name oder es kann nicht eingestellt werden.

Ein anderer Ansatz besteht darin, die Metadaten für die Eigenschaft abzurufen und sie dann festzulegen. So können Sie prüfen, ob die Eigenschaft vorhanden ist und ob sie eingestellt werden kann:

using System.Reflection;
MyObject obj = new MyObject();
PropertyInfo prop = obj.GetType().GetProperty("Name", BindingFlags.Public | BindingFlags.Instance);
if(null != prop && prop.CanWrite)
{
    prop.SetValue(obj, "Value", null);
}

333voto

El Cheicon Punkte 4476

Das können Sie auch tun:

Type type = target.GetType();

PropertyInfo prop = type.GetProperty("propertyName");

prop.SetValue (target, propertyValue, null);

wobei target das Objekt ist, dessen Eigenschaft festgelegt werden soll.

106voto

Marc Gravell Punkte 970173

Reflexion, grundsätzlich, d.h.

myObject.GetType().GetProperty(property).SetValue(myObject, "Bob", null);

oder es gibt Bibliotheken, die sowohl in Bezug auf die Bequemlichkeit als auch auf die Leistung helfen; zum Beispiel mit FastMember :

var wrapped = ObjectAccessor.Create(obj); 
wrapped[property] = "Bob";

(was auch den Vorteil hat, dass man nicht im Voraus wissen muss, ob es sich um ein Feld oder eine Eigenschaft handelt)

33voto

Erik K. Punkte 944

Oder Sie könnten Marcs One-Liner in Ihre eigene Erweiterungsklasse einbinden:

public static class PropertyExtension{       

   public static void SetPropertyValue(this object obj, string propName, object value)
    {
        obj.GetType().GetProperty(propName).SetValue(obj, value, null);
    }
}

und nennen Sie es so:

myObject.SetPropertyValue("myProperty", "myValue");

Zur Sicherheit fügen wir noch eine Methode hinzu, um einen Eigenschaftswert zu erhalten:

public static object GetPropertyValue(this object obj, string propName)
{
        return obj.GetType().GetProperty(propName).GetValue (obj, null);
}

16voto

Ardalan Shahgholi Punkte 10869

Verwenden Sie etwas wie dies:

public static class PropertyExtension{       

   public static void SetPropertyValue(this object p_object, string p_propertyName, object value)
   {
    PropertyInfo property = p_object.GetType().GetProperty(p_propertyName);
    property.SetValue(p_object, Convert.ChangeType(value, property.PropertyType), null);
   }
}

o

public static class PropertyExtension{       

   public static void SetPropertyValue(this object p_object, string p_propertyName, object value)
   {
    PropertyInfo property = p_object.GetType().GetProperty(p_propertyName);
    Type t = Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType;
    object safeValue = (value == null) ? null : Convert.ChangeType(value, t);

    property.SetValue(p_object, safeValue, null);
   }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X