2016-07-14 57 views
0

我有一個外部庫,我正在使用,即Aspose.Email.dll(可在NuGet)。它有一個PageInfo類。 轉到定義顯示Visual Studio中它下面:如何使用反射來設置此對象的屬性?

using System; 

namespace Aspose.Email 
{ 
    public class PageInfo 
    { 
     protected PageInfo next; 

     public int AbsoluteOffset { get; } 
     public int ItemsPerPage { get; } 
     public bool LastPage { get; } 
     public virtual PageInfo NextPage { get; } 
     public int PageOffset { get; } 
     public int TotalCount { get; } 
    } 
} 

長話短說,我需要創建一個PageInfo對象。我如何使用Reflection創建一個並設置其屬性ItemsPerPage

我已經試過這樣:

var result = (PageInfo)FormatterServices.GetUninitializedObject(typeof(PageInfo)); 
typeof(PageInfo).GetProperty("ItemsPerPage", BindingFlags.Instance | BindingFlags.Public).SetValue(result, 1); 

的問題是,SetValue錯誤出與Property set method not found.

+0

你在做什麼,你需要創建一個'PageInfo'?也許如果你問一個關於*「我怎樣才能不使用自己的PageInfo來實現X」的新問題?*你可能有比使用反射更好的解決方案。 –

+0

我擔心有人會問。我正在編程一個抽象接口庫來整合我使用的兩個不同的郵件庫(這和Exchange庫)我試圖合併一種在兩者之間分頁數據的方法。不幸的是,這個IMAP庫的一個大問題是,你不能真正建立一個任意的分頁查詢,但是在你第一次打電話來獲取分頁數據之後,必須總是使用一個鏈接的分頁對象。這是因爲圖書館的性質以及它的API如何實施以致它變得有點痛苦。 – Alexandru

回答

1

僅消氣屬性沒有setter方法。他們使用只能在構造函數中設置的readonly支持字段。

您可以更改屬性以使私人設置器(例如,

public int ItemsPerPage { get; private set; } 

如果您沒有訪問代碼,你可以使用GetField找到匹配字段並設置其值。

typeof(PageInfo).GetTypeInfo().DeclaredFields 
    .First(f => f.Name.Contains("ItemsPerPage")).SetValue(result, 1); 
+0

無法更改庫,因爲我沒有源代碼,所以我無法編輯'ItemsPerPage'屬性。 – Alexandru

+0

@亞歷山大我更新了我的答案。試試看。 –

+0

使用* dotPeek *檢查庫,並通過'DeclaredFields'進行枚舉...我有點不知所措,因爲...他們的命名字段包含名稱,例如'#= qOeu6uj6DPtGwJ1qAj8pvJQ ==''''' = qQACP_gKR9skNS8JCd3aPRw ==',這讓我相信他們正在爲每個版本的庫哈希它們,這很糟糕,因爲升級能力超出了窗口...... – Alexandru

相關問題