簡體   English   中英

C# .net - 覆蓋現有的內置 function + 獲取底層方法代碼

[英]C# .net - override existing built-in function + get underlying method code

抱歉,如果這些是非常基本的問題,但假設我正在使用 BlockingCollection 的 void Add(T item) function:

1)我將如何覆蓋添加 function,即如果我想在開頭添加一個檢查然后調用基礎 function,這可能嗎,如果是這樣,代碼看起來像這樣嗎?

protected sealed class BlockingCollection<T> : IEnumerable<T>
    {
        protected override void Add(T item)
        {
            // do something here
            // call base blockingcollection add function, something like return base.Add(item)??
        }
    }

2) 如果不是調用基礎 function,而是想實際修改 Add 代碼,有沒有辦法獲取 Add function 的底層代碼? 我會使用諸如反射之類的東西嗎? 如果是這樣,有沒有什么方法可以在不編寫我自己的程序並使用反射來獲取方法代碼的情況下獲取底層代碼(即我可以在 Visual Studio IDE 本身中獲取底層方法代碼,而無需每次編寫/編譯/運行代碼是時候我想獲取方法的底層代碼了?)?

IEnumerable 沒有“添加”方法; 你必須實現你自己的。 但是,ICollection 可以!

此外,因為 IEnumerable/ICollection 是接口,而不是類,所以沒有現有的實現供您覆蓋。 你必須自己做那部分。


編輯可能的額外超級重復正確性:

如果你試圖繼承 BlockingCollection 並且你想在通過“添加”添加 T 之前做一些額外的“東西”,你可以這樣做:

public class Foo<T> : BlockingCollection<T>
{
    public new void Add(T item)
    {
        base.Add(item);
        base.Add(item);
    }
}

因此,這個極其簡單的實現將通過兩次“添加”添加您放入 Foo 的任何內容。

我希望你知道你正在創建一個全新的BlockingCollection class,你沒有修改System.Collections.Concurrent.BlockingCollection<T> ZA2F2ED4F8EBC2CBB4C21A29DC40AB.61 的部分

實際上修改BlockingCollection<T>.Add的庫版本至少很難說。 它作為簽名的二進制文件分發,並且 .NET 不提供繞道式機制。 盡管DynamicMethod允許您向現有類添加新方法,但我認為您不能使用它來替換現有方法。

1)是的,這是做你所要求的正確方法。

2) 您使用反編譯器查看您選擇覆蓋的庫 API 的源代碼。 這是由您(人類)完成的,而不是作為程序執行的一部分。

反射有點不同。 它允許您的代碼在運行時訪問 API,但不會訪問或公開 API 的源代碼。 那里有很多資源,但您可以從MSDN開始。

更新:

由於您要覆蓋的方法是void ,因此您可能無法通過返回某些內容來更改實現。 嘗試這個:

protected override void Add(T item)
{
    // do something here
    // call base blockingcollection add function
    base.Add(item);

    // this is unnecessary, but you could do it for giggles
    return;
}

如果原始庫允許您覆蓋 Add 那么您顯示的偽代碼是正確的。 如果我正確理解您的問題,您確實需要進行一些修改。

首先,您將創建自己的 class,繼承舊的 class,如果舊的 class 尚未實現 IEnumerable 接口,則該方法尚未完成。 當然,如果舊的 class 是“密封的”,您將無法執行此操作。

protected sealed class MyBlockingCollection<T> : BlockingCollection<T>, IEnumerable<T>
{
    protected override void Add<T>(T item)
    {
    }
}

現在將您的 class 標記為密封將防止任何人進一步覆蓋暴露的方法。 如果舊的 class 標記為密封,您將無法執行此操作。

要查看代碼,您需要使用一種工具來反編譯該庫,該工具可能容易或困難,具體取決於可能會或可能不會使用的混淆級別來阻止您這樣做。

編輯:只是打開代碼,您應該檢查參考以確保您具有適合您正在嘗試執行的操作的語法。

暫無
暫無

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

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