簡體   English   中英

在哪里將擴展擴展到庫中的靜態類? (在C#中)

[英]Where to put extensions to a static class in a library? (in C#)

盡管我的問題通常是關於C#的,但我將通過舉一個具體的例子來提出這個問題。

我已經寫了一個函數EnsureDirectoryPresent ,它是.NET BCL庫中System.IO.Directory類的擴展。 我最好在哪里放這個新功能?

從概念上講,該方法是Directory類的擴展方法。 遺憾的是,它是一個靜態類,因此我無法使用該功能。

.NET框架設計指南 (第2版)說把在孩子命名空間的類(或類)(如“...擴展”)。 這是為了允許程序員控制使用情況,不使用using指令將阻止可能不需要的擴展:

除非將擴展方法用於向接口添加方法或進行依賴項管理,否則請勿將擴展方法與擴展類型放在同一命名空間中。 當然,在后一種情況下,類型將在不同的組件中。

但是,該框架在某些地方違反了該指南的精神(例如,如果您使用XPathDocument等,然后開始使用XML到LINQ,則System.Xml.XPath.Extensions類將在范圍內)。

您不能擴展System.IO.Directory ,因為它是靜態類。 但你可以擴展System.IO.DirectoryInfo -這是一個非靜態對口System.IO.Directory

然后,您將可以像這樣使用它:

(new DirectoryInfo(@"C:\Foo\Bar\Baz").EnsureDirectoryPresent();

您已經確定不能使用擴展方法將靜態方法附加到Directory類。 在我看來,下一件最好的事情是簡單地為目錄相關的函數創建一個新的靜態類。 通常使用Utils后綴。 我認為這是您最簡單的操作。

static class DirectoryUtils
{
    public static void EnsureDirectoryPresent(string dir) { }
}

DirectoryUtils.EnsureDirectoryPresent(someDirectory);

那里語法上的唯一區別(與Directory同名的靜態方法相反)是文本“ Utils”。 但是,“可發現性”與使用擴展方法不同-您必須了解DirectoryUtils類。

擴展方法僅擴展實例方法。 您不能擴展類的靜態方法。 原因是將程序集加載到內存時,靜態方法本身就是類型,因此您實際上無法擴展它們。

此外,擴展方法比框架更具有編譯器/ IDE /語言功能。

更新

我在這里得到了否定-我認為這是不必要的-但這里是澄清:

擴展方法是通過使用靜態方法實現的,但是您可以從對象而不是類型中訪問它們。 因此,第一個參數始終是“ this”。

暫無
暫無

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

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