簡體   English   中英

如何擴展密封類屬性

[英]How to Extend a Sealed Class Property

假設您在編譯文件(dll)中有一個密封的類,並且該類具有一個只讀的公共屬性,如下所示:

public sealed class MyClass
{
    public MyClass();

    public Guid id { get; }
}

然后添加對您的項目的引用。

我的問題是:有什么方法可以將設置器添加到Property ID?

我真正需要的是為此屬性分配一個值。

讓我解釋一下。 我們有一個獨立的Web應用程序(A),該應用程序使用兩個運行良好的dll發出對外部應用程序(B)的Web服務請求。 App B具有2個幾乎包含相同類的不同dll。 應用程序A使用兩個dll發出請求。 現在,我們為彼此“兼容”(或至少具有相同名稱)的類創建一個新的庫,以便僅使用一個類。 現在,我看到在一個dll中,該類MyClass的屬性ID為read / write,另一方面,另一個DLL的屬性與我先前向您展示的一樣只讀。

首先用反射器或類似工具反匯編dll。 然后找出吸氣劑的工作原理。 幸運的是,它正在讀取一個字段,但沒有其他內容,但是如果它做的事情更復雜,那么在創建二傳手中您將有更多工作要做。 可以說它確實是一個字段,該字段稱為_privateGuidField

創建一個類,該類定義擴展方法SetId(this MyClass obj, Guid newID) ,該方法獲取該FieldInfo並在其上調用SetValue

這僅適用於完全信任的代碼。

然后坐下來等待類,您剛剛將其保證代碼的不變式粉碎了,以一種非常奇怪的方式進行了操作。 如果創建了該類,請不要向創建它的人抱怨,因為您只是將他們的代碼撕裂了,所以沒有必要抱怨它是否不再起作用。

沒有合法的方法:密封該類,並且該屬性為只讀。 如果該類使用id屬性實現接口,則可以將該類包裝到您的類中,並提供getter和setter。 從目前的情況來看,您唯一的選擇是通過反思進行黑客攻擊,這根本不是一個有效的選擇。 根據屬性的實現方式,即使進行反射也可能無法實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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