2013-03-22 59 views
3

我想建立一個Windows商店類庫使用源代碼從一個正常的.NET框架類庫。理想情況下,我不想修改原始源代碼文件。我可以在.NET API中「添加」靜態方法到現有的類嗎?

在某些從.NET Framework庫的源代碼文件,靜態成員是從在兩個常規.NET框架 API和.NET的Windows Store應用程序定義的類使用API,但只有部分成員可用於Windows應用商店

一個具體示例是System.IO.Path,其中GetFullPath method不適用於Windows應用商店應用

這是相當簡單的合併對這種方法的替代品,我Windows應用商店的類庫,並有原始源代碼調用此方法來代替。我的問題是,有沒有任何我可以做到這一點,而無需修改原始源代碼文件?到目前爲止,我還沒有能夠找到令人滿意的解決方案來解決這個問題,但是我通過實現例如我的Windows Store類庫來解決這個問題。該Path.GetFullPath(string)方法在另一個命名空間:

namespace WindowsStoreLib.System.IO { 
    public static class Path { 
     public static string GetFullPath(string path) { ... } 
    } 
} 

,然後加在原始文件的預處理器指令:

#if NETFX_CORE 
using Path = WindowsStoreLib.System.IO.Path; 
#endif 

是否有其他解決這個問題,做要求原來的修改源代碼文件?

+0

製作您的庫的兩個版本,一個重新實現所需的內容,另一個只調用本地版本,並根據您的應用程序版本包含不同的版本。 – millimoose 2013-03-22 12:44:27

+2

簡短的回答是:不,您不能將靜態方法添加到現有類。 – 2013-03-22 12:46:06

+0

@millimoose我希望能夠在不修改的情況下重用基於.NET Framework的庫中的原始源代碼,並在這些文件中使用例如'Path.GetFullPath()'。 – 2013-03-22 12:46:49

回答

5

不,你不能,簡單地說。

當我在做跨平臺的東西時,我傾向於編寫一個實用程序類,它對不同的平臺有不同的實現(通過#if) - 然後我的核心代碼只是調用實用程序類。

+0

謝謝,Marc。是的,我通常自己使用「實用程序類」方法,但我希望有一些我忽略了的東西:-)顯然不是,但至少可以得到獨立的確認。 – 2013-03-22 12:50:47

0

我一直在用Entity Framework類來做類似的事情,因爲我需要將2個字段的特定輸出添加爲1,並在每次更新時將其從designer.cs中刪除。但是,它們不是靜態類或靜態方法,但應該使用相同的。

使用要擴展的類的名稱創建一個新的類文件,並使用部分限定符。

namespace WindowsStoreLib.System.IO { 
    public partial static class Path { 

     public static string GetFullPath(string path) { ... } 
    } 
} 
+0

謝謝,@lostcny。問題在於,除非我修改原始源代碼文件,否則即使它位於部分類中,我也不會**引用該方法(或甚至構建該庫)。而修改是我想避免的。 – 2013-03-22 12:54:50

+0

是的,只是試過了,這是一個無賴。 – lostcny 2013-03-22 12:59:08

0

正如Marc所說,預處理器指令似乎是唯一的解決方案。

但是當我讀到「靜態類」和「現有類」時,我想到的第一件事就是「擴展方法」。如果您在代碼所在的同一名稱空間中爲Path創建了擴展方法,會發生什麼情況?

namespace MyNamespace.WhereMyCodeIs 
{ 
    using System.IO; 

    public static class ExtensionMethods 
    { 
     public static string GetFullPath(this Path pathObject, string path) 
     { 
      // Implementation 
     } 
    } 
} 

我真的不確定這是否會奏效,但也許有一個解決辦法,我們可以找到這個。

+3

擴展方法僅適用於實例。你不能用它們來讓它看起來像現有類中有新的靜態方法(儘管我希望你有很多次)。 – 2013-03-22 13:13:40

+0

哦,是完全正確的。我也曾多次希望這一點。算了吧! – Ucodia 2013-03-22 13:14:58

+1

謝謝,@Ucodia,但正如Joe指出的那樣(謝謝Joe)你需要一個實例來使用擴展方法。我已經考慮過了,但也無法使用擴展方法提出可行的解決方案。 – 2013-03-22 13:28:42

相關問題