2013-02-24 64 views
0

我試圖將許多輔助類組合到一個公共父類中,以方便使用。舉例來說,在我的應用我想要做仿真程序集上的部分類

Tools.StringTool.foo(..) 
Tools.NumberTool.bar(..) 
Tools.NetworkTool.something(...) 

的想法在這裏組織一個常用工具類下的所有工具,使智能感知能夠爲他們帶來所有,當我鍵入「工具」。

在父靜態部分類下定義所有工具工具正常​​工作,但不適用於其他部件中的工具。

我試圖通過用名稱空間X.Y.Tools替換父Tools類來模擬組件中的靜態部分類,但是對於在X.Y命名空間外編寫的代碼,我需要在使用它之前完全限定每個工具。

即在應用程序代碼

Tools.MyTool(..) // won't compile 
    X.Y.Tools.MyTool(...) // will compile but ugly 

任何建議,我怎麼能解決這個問題,或者組織工具的替代方法?

+0

對不起,我想我誤解了這個問題。僅僅定義命名空間「Tools」而不是命名空間「X.Y.Tools」有什麼問題? – syazdani 2013-02-24 04:32:14

+0

我對這個問題有點遲了,但你是否考慮實施Facade模式?即MyUnionClass,它通過各種程序集公開包裝方法。 – bdeem 2016-05-04 19:49:34

回答

1

在這種情況下,您可以使用擴展方法。在命名空間中的類中定義的所有擴展方法在該命名空間導入時可用。

這樣你就會有靜態類,如MyUtilityNamespace.MyClassInAssembly1MyUtilityNamespace.MyClassInAssembly2所有提供擴展方法到一個類的實例,但這已經與得到那個類的實例,像這樣有關醜:

// in central assembly 
class Tool { 
    private static Tool _t = new Tool(); 
    public static Tool T { get { return _t; } } 
} 
// in utility assembly 1 
public static class MyExtensionClassInAssembly1 { 
    public static void SomeUtilityMethodX(this Tool tool, Object arg1, Object arg2) { 
     // do something 
    } 
} 
// in utility assembly 2 
public static class MyExtensionClassInAssembly2 { 
    public static void SomeUtilityMethodY(this Tool tool) { 
     // do something 
    } 
} 

你」 D使用它像這樣:

Tool.T.SomeUtilityMethodX(Tool.T.SomeUtilityMethodY(), null); 

它不是漂亮,而是意味着你只需要一次導入一個命名空間,且Tool.T是恆定的,沒有必要記住StringToolNetworkTool

另一種選擇是使用名稱空間或類型別名,但這很費力,因爲您需要在每個源文件上指定using Tools = X.Y.Tools.MyTool;行。

+0

我認爲需要解決這個問題的是「靜態擴展方法」,這在.NET中不可用。現在,我將繼續使用父部分靜態類,但每個程序集都有一個(例如,CoreTools.Stringtool,Core.dll中的CoreTools.NumberTool,NetTool.MimeTools,Net.dll中的NetTool.SocketTool等)。徵求建議,你確實提供了替代方案,所以我接受了你的答案。 – 2013-02-24 06:25:57