2012-10-19 16 views
21

Powiel możliwe:
.Net - Reflection set object property
Setting a property by reflection with a string valueC# dynamicznie ustawić właściwość

Jestem pewien, że istnieje prosty sposób to zrobić i mam być gruba, ale mogę” Zrozumcie to dla mojego życia.

Mam obiekt z wieloma właściwościami. Nazwijmy obiekt objName. Próbuję utworzyć metodę, która po prostu aktualizuje obiekt z nowymi wartościami właściwości.

Chcę być w stanie wykonać następujące czynności w metodzie:

private void SetObjectProperty(string propertyName, string value, ref object objName) 
{ 
    //some processing on the rest of the code to make sure we actually want to set this value. 
    objName.propertyName = value 
} 

I wreszcie wezwanie:

SetObjectProperty("nameOfProperty", textBoxValue.Text, ref objName); 

Nadzieję kwestia jest uregulowana za mało. Daj mi znać, jeśli potrzebujesz więcej informacji.

Dzięki za odpowiedzi wszystkie!

+0

@DavidArcher nie ma klawiatury "rel" w języku C# ... Biorę to masz na myśli 'ref'? Nie ma potrzeby przekazywania obiektu jako 'ref', chyba że masz zamiar zmienić jego rzeczywistą instancję. – James

+0

Rzeczywiście, miałem na myśli ref, i tak, mam zamiar zmienić rzeczywistą instancję. –

Odpowiedz

40

objName.GetType().GetProperty("nameOfProperty").SetValue(objName, objValue, null)

+1

Powinieneś użyć 'propertyName' wewnątrz' GetProperty() '. – Anonymous

+0

A co jeśli "* nameOfProperty *" nie istnieje? – James

+0

Wyjątek oczywiście, możesz użyć GetProperties do przetestowania. – josejuan

26

Można użyć do tego celu Reflection, np.

private void SetObjectProperty(string propertyName, string value, object obj) 
{ 
    PropertyInfo propertyInfo = obj.GetType().GetProperty(propertyName); 
    // make sure object has the property we are after 
    if (propertyInfo != null) 
    { 
     propertyInfo.SetValue(obj, value, null); 
    } 
} 
+2

Rekwizyty do sprawdzania zerowej wartości przed wywołaniem. –

1

uzyskać informacje własność, a potem ustawić wartość na posesji:

PropertyInfo propertyInfo = objName.GetType().GetProperty(propertyName); 
propertyInfo.SetValue(propertyInfo, value, null); 
3

Można użyć Type.InvokeMember to zrobić.

private void SetObjectProperty(string propertyName, string value, rel objName) 
{ 
    objName.GetType().InvokeMember(propertyName, 
     BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty, 
     Type.DefaultBinder, objName, value); 
} 
1

Można to zrobić za pośrednictwem refleksji:

void SetObjectProperty(object theObject, string propertyName, object value) 
{ 
    Type type=theObject.GetType(); 
    var property=type.GetProperty(propertyName); 
    var setter=property.SetMethod(); 
    setter.Invoke(theObject, new ojbject[]{value}); 
} 

UWAGA: Obsługa błędów celowo pominięte ze względu na czytelność.

Powiązane problemy