![](/img/trans.png)
[英]Setting value of a bound property from the setter of another bound property
[英]Setting property value with no setter using PrivateObject
使用PrivateObject
,我正在嘗試創建ItemChange
類的實例(在此處找到)。 通過調試器以及Visual Studio 2008中的對象瀏覽器,我似乎無法找到除了 setter之外的任何與ItemId
屬性相關的內容。 以下是我正在使用的代碼。
var itemChange = new PrivateObject(typeof(ItemChange));
itemChange.SetFieldOrProperty("ChangeType", _fixture.CreateAnonymous<ChangeType>());
itemChange.SetFieldOrProperty("ItemId", _fixture.CreateAnonymous<ItemId>());
我收到的錯誤是:
System.MissingMethodException : Method 'Microsoft.Exchange.WebServices.Data.ItemChange.ItemId' not found.
我嘗試過BindingFlags
變種,但似乎沒有任何幫助。 如何設置沒有setter且只有getter的屬性?
關於我的注釋,我可以創建一個PrivateObject
對象實例並設置ItemId
的另一個內聯類是ItemEvent
類(在這里找到)。 這個類很簡單,因為當我調試並將類添加到我的監視列表時,我可以看到itemId
作為私有變量。 然而,在執行上相同的步驟ItemChange
類我找不到 任何痕跡ItemId
不是物業本身只具有一個setter其他領域。 這是我對如何設置此屬性感到困惑的地方。
最后,我無法訪問允許我反編譯該類並查看其內容的工具。
如果您嘗試設置的屬性是只讀的,並且沒有任何底層私有字段支持,那么您實際上無法設置它。 例如,如果您具有以下屬性:
public string ItemId
{
get
{
return "Test";
}
}
你所做的就是將這個屬性設置為另一個值。 如果在查看調試器和/或反射中的對象字段時沒有看到明顯的后備字段,則可能是這種情況。
在這種情況下,如果我不得不猜測,我會說ItemId可能是一個簡單的返回this.Item.Id
的快捷方式屬性。
編輯:
我部分屬實。 根據dotPeek, ItemChange.ItemId
只返回Change.id
,適當地進行類型轉換。 如果Change.serviceObject
有一個值,則Change.id
返回Change.serviceObject.GetId()
,否則返回Change.id
。 根據您的情況,哪些適合您的情況取決於您所討論的更改類型,根據MSDN:
當ChangeType屬性的值為ChangeType.Delete或ChangeType.ReadFlagChange時,Item為null。
實際上,Change和ItemChange的實現是這樣的:
public class Base
{
private Thing thing;
private BaseId id;
internal BaseId Id
{
get
{
return this.thing == null ? this.id : this.thing.GetId();
}
}
}
public class Child
{
public ChildId ChildId
{
get
{
return (ChildId) this.Id;
}
}
}
在實際的Change
實現中,物場是一個ServiceObject
命名serviceObject
,其中有一個GetId()
返回的方法ServiceId
,並且也有一個id
類型的字段ServiceId
。 要設置ItemChange
對象的ItemId
屬性,需要在對象的基類上設置其中一個或另一個內部字段(如果設置了serviceObject
字段,則優先使用該字段。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.