簡體   English   中英

使用PrivateObject設置沒有setter的屬性值

[英]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其他領域。 這是我對如何設置此屬性感到困惑的地方。

最后,我無法訪問允許我反編譯該類並查看其內容的工具。

公共get-only屬性不一定具有私有setter。 如果您自己沒有創建目標類,則可能需要使用像Reflector這樣的反編譯來確定需要更改的內容,以便更改屬性getter返回的值。

如果您發現自己經常需要執行此類操作,則可能需要考慮使用備用方法來控制第三方代碼的行為,而無需使用適當的擴展掛鈎。 例如, Moles會允許您在不知道任何有關屬性或類的內部信息的情況下將您自己想要的行為替換為getter。

如果您嘗試設置的屬性是只讀的,並且沒有任何底層私有字段支持,那么您實際上無法設置它。 例如,如果您具有以下屬性:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM