Einstellung der Eigenschaft-Wert mit keine setter verwenden PrivateObject
Mit einem PrivateObject
ich bin versucht, erstellen Sie eine Instanz der ItemChange
Klasse (gefunden hier). Blick durch den debugger als auch das Objekt-browser in Visual Studio 2008 kann ich nicht scheinen, um herauszufinden alles im Zusammenhang mit der ItemId
andere Eigenschaft als ein setter. Unten ist der code, den ich verwende.
var itemChange = new PrivateObject(typeof(ItemChange));
itemChange.SetFieldOrProperty("ChangeType", _fixture.CreateAnonymous<ChangeType>());
itemChange.SetFieldOrProperty("ItemId", _fixture.CreateAnonymous<ItemId>());
Die Fehler ich erhalte, ist:
System.MissingMethodException : Method 'Microsoft.Exchange.WebServices.Data.ItemChange.ItemId' not found.
Habe ich versucht, Variationen des BindingFlags
, aber nichts scheint zu helfen. Wie kann ich mir eine Immobilie, die keine setter und nur eine get?
Bearbeiten
Bezüglich meiner Kommentare, die andere inline-Klasse, ich kann eine PrivateObject
Objekt-Instanz und legen Sie das ItemId
ist die ItemEvent
Klasse (gefunden hier). Diese Klasse war einfach, weil wenn ich Debuggen und fügte hinzu, die Klasse zu meiner watch-Liste konnte ich sehen itemId
wie eine private variable. Allerdings, die Durchführung der gleichen Schritte auf der ItemChange
Klasse I nicht finden alle Spuren einer ItemId
anderen Bereich als die Immobilie selbst, dass nur hat einen setter. Dies ist, wo ich bin ratlos, wie um diese Eigenschaft festzulegen.
Schließlich ich don ' T haben Zugang zu einem tool, das mir erlauben würde, zu dekompilieren, die Klasse und sehen, was was ist.
- Es ist ein wenig kompliziert und es kann fehlschlagen, wenn Sie änderungen an der Implementierung, sondern können Sie mithilfe von Reflektion?
- Ich dachte
PrivateObject
wurde ein wrapper um alle, die Reflexion Zeug, nicht? - Sie brauchen, um zu versuchen und legen Sie die private variable, wie es ist, die Sie versucht, in der öffentlichkeit eine, die scheitern.
- Wenn Sie eine Eigenschaft nennen Sie es nicht verstehen können, was die backing-store.
- Das ist es, was ich meinte, als ich sagte, dass ich nicht finden können, alles, was mit
ItemId
wenn ich Debuggen. Es gibt auch andere inline-Kurse, die ich erstellen können, die privaten Objekte. Wenn ich Debuggen kann ich sehen, es sind Felder genannt_itemId
. - Also stimmt dann
itemChange.SetFieldOrProperty("_itemId", _fixture.CreateAnonymous<ItemId>());
Arbeit? - Leider nicht. Siehe edit.
- wichtiger Hinweis: beim Graben in den Eingeweiden der a-Klasse, Hör nicht auf, bis Sie auf
object
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn die Immobilie, die Sie versuchen, können nur gelesen und nicht gesichert, indem die zugrunde privaten Bereich, dann kann man eigentlich nicht einstellen können. Zum Beispiel, wenn Sie hatte die folgende Eigenschaft:
nichts, was Sie tun, jemals zu setzen Sie diese Eigenschaft auf einen anderen Wert. Wenn Sie nicht sehen, eine offensichtliche Feld sichern, wenn man das Objekt Felder in den debugger und/oder Reflexion, dies ist wahrscheinlich die situation.
In diesem Fall, wenn ich hatte, um eine Vermutung, würde ich sagen, dass die ItemId ist wahrscheinlich eine Verknüpfung Eigenschaft, dass Sie einfach zurück
this.Item.Id
.EDIT:
Ich war teilweise wahr. Nach dotPeek,
ItemChange.ItemId
nur zurückChange.id
, entsprechend festgelegt. WennChange.serviceObject
einen Wert hat, alsChange.id
zurückChange.serviceObject.GetId()
, sonst gibt esChange.id
. Welche von denen eignet sich in Ihrem Fall ist, hängt von der Art der änderung, die Sie sprechen, pro MSDN:Effektiv, die Umsetzung der Veränderung und ItemChange soetwas macht:
In der eigentlichen
Change
Umsetzung, das Objekt Feld ist einServiceObject
namensserviceObject
, die eineGetId()
Methode gibt eineServiceId
, und es ist auch einid
Feld vom TypServiceId
. Um IhreItemChange
ObjektItemId
- Eigenschaft festgelegt haben, müssen Sie die eine oder die andere dieser internen Felder auf das Objekt der Basisklasse (dieserviceObject
Feld hat Vorrang, wenn er gesetzt ist.)ItemChange
undChange
, die empfangen wurde, von dotPeek? Bis ich gehe durch die richtigen Kanäle zu haben, dotPeek installiert, es wird ein paar Wochen. Danke.Einer öffentlichen get-only-Eigenschaft nicht unbedingt haben private setter. Wenn Sie nicht Autor der Ziel-Klasse selbst, werden Sie wahrscheinlich benötigen, um schnappen Sie sich einen decompiler wie Reflektor, um herauszufinden, was Sie brauchen, um zu ändern, um zu ändern, wird der Wert zurückgegeben, der von der Eigenschaft getter.
Wenn Sie feststellen, selbst benötigen, das zu tun diese Art der Sache oft, möchten Sie vielleicht zu prüfen, mit einem alternativen Ansatz zur Steuerung des Verhaltens von third-party-code, ohne entsprechende Verlängerung Haken. Zum Beispiel, Maulwürfe erlauben würde, Sie zu ersetzen Sie Ihre eigenen gewünschten Verhalten für die getter-ohne zu wissen, etwas über das Innenleben des Eigentums oder der Klasse.