2013-02-24 29 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