Laden...

Property ohne Setter -> Per Reflektion Value setzen

Erstellt von inflames2k vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.292 Views
inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 13 Jahren
Property ohne Setter -> Per Reflektion Value setzen

Hallo,

ich möchte eine Instanz einer Klasse mit private Contructor erstellen. Dies klappt soweit mittels Reflection.

Nun möchte ich den Wert einer Property ändern, die jedoch keinen Setter hat. Ist dies in irgendeiner Weise möglich?

Mit PropertyInfo.SetValue erhalte ich die Fehlermeldung, dass kein Setter für die Property existiert.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

1.552 Beiträge seit 2010
vor 13 Jahren

Hallo inflames2k,

ja das geht, falls das Property ein Feld als "Datenquelle" hat. Ansonsten sehe ich es als nicht möglich


public class Test
{
    private int hiddenField = 0;
    public int Field
    {
        get { return hiddenField; }
    }
    public int SecondField{get{return -1;}} //ich denke, hier ist es nicht möglich
}

FieldInfo fld = typeof(Test).GetField("hiddenField", BindingFlags.Instance | BindingFlags.NonPublic);
fld.SetValue(obj, 1);

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo inflames2k,

das ist nicht möglich und kann ich mir auch nicht vorstellen. Wenn ein Getter vorhanden ist, dann könnte es ein privates Feld geben. Wie sieht der Code aus? Das wäre im Grunde das gleiche. Was du noch machen kannst, wäre Code nachträglich zu injizieren. Stichwort: Reflexil, Reflector, Add-In.

zero_x

Gelöschter Account
vor 13 Jahren

Was du noch machen kannst, wäre Code nachträglich zu injizieren.

Und der sollte dann was machen?....

Also generell ist ein Property nichts anderes als ein ersatz für Methoden. Wenn du ein Get und ein Set hast, dann sind das in wirklichkeit 2 separate Methoden. Fehlt ein Set, so gibt es die Methode nicht...
Das ist auch der Grund, warum du in den Settern und Gettern die selben Freiheiten hast, wie innerhalb von Methoden.

Du müsstest also herausfinden, was der besagte Setter tun könnte, und dann per reflection das verhalten nachbauen.

Im Idealfall ist es nur das setzen eines Feldes.
Im Schlechtesten Fall musst du reverse engeneering betreiben und herausfinden, wie der wert überhaupt zustandekommt und welche implikationen dann eine Manipulation der/des Wertes hat.

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo JAck30lena,

mit "Code nachträglich injizieren" meine ich einfach, den Code so zu verändern, dass es klappt bzw. klappen muss, ohne das er Reflection verwenden muss. Das ist zwar die Hammermethode, aber trozdem eine Lösung. Es könnte ihn helfen. Das ist aber nur ein Vorschlag/Idee. Der IL-Code steht offen da. Man kann den Code nach belieben ändern. Und das ist garnicht mal so schwer.

zero_x

inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 13 Jahren

Danke, mit dem GetField() hatte ich wohl mal wieder Tomaten auf den Augen, da dies vollkommen ausreicht. -> Ich möchte an der Stelle auch nur den Wert ändern.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

Gelöschter Account
vor 13 Jahren

Ich sehe keinen Sinn darin eine set_Field Methode zu injizieren ausser dem Coolness Faktor, gerade auch wegen der von JAck30lena beschriebenen Problematik. Die Alternative ist einfach der Weg von xxMUROxx

1.552 Beiträge seit 2010
vor 13 Jahren

Fehlt ein Set, so gibt es die Methode nicht...

Du müsstest also herausfinden, was der besagte Setter tun könnte, und dann per reflection das verhalten nachbauen.

Du wiedersprichst dich. Es gibt keinen Setter also braucht man auch nicht herausfinden was er intern macht.

Im Schlechtesten Fall musst du reverse engeneering betreiben und herausfinden, wie der wert überhaupt zustandekommt und welche implikationen dann eine Manipulation der/des Wertes hat. Dies ist jedoch ein Argument, da der Wert überall gesetzt werden kann und man nicht weiß wie und wieso.

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

Gelöschter Account
vor 13 Jahren

Du wiedersprichst dich. Es gibt keinen Setter

Du hast mich nur missverstanden. Ich meinte nicht den physikaltischen Setter, den man aufrufen könnte, sondern den Abstrakten, der den Wert des "Get" erzeugt.

Das muss nicht zwangsläufig eine einzige Methode sein....

edit:
Ein Beispiel wäre GetHashCode der String Klasse (ist ja im Prinzip wie ein Get an einem Property). Man kann den HashCode nicht setzen aber man kann ihn auslesen. Möchte ich aber einen HashCode setzen, so muss ich das über die Manipulation des strings machen, aus dem der HashCode gebildet wird. Ich verwende also die abstrakte Version des Setters oder evtl besser ausgedrückt den "Indirekten Weg".

Implikation dessen ist aber, das der String anders ist und daher auch evtl. andere unerwünschte Auswirkungen auf meinen Code hat.

Gelöschter Account
vor 13 Jahren

Hallo xxMUROxx,

Du musst doch rauskriegen was der Getter tut um zu wissen was der injizierte Setter tun soll.

Der Getter kann so aussehen:


get
{
  return _field;
}

oder so:


get
{
  return _field * 3;
}

1.552 Beiträge seit 2010
vor 13 Jahren

Danke für die Erklärung eurer Gedanken. Sie sind für mich nachvollziehbar und verständlich

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp