我正在尝试将许多帮助程序类组合到一个公共父类中以便于使用。例如,在我想要的应用程序中
Tools.StringTool.foo(..)
Tools.NumberTool.bar(..)
Tools.NetworkTool.something(...)
这里的想法是在一个常见的Tools类下组织所有工具,以便当我输入“Tools”时intellisense可以全部启动它们。
定义父静态分部类下的所有工具工具可以正常工作,但不适用于不同程序集中的工具。
我尝试通过将命名空间X.Y.Tools替换为父工具类来模拟程序集中的静态部分类,但是对于在X.Y命名空间外部编写的代码,我需要在使用它之前完全限定每个工具。
即。在应用程序代码中
Tools.MyTool(..) // won't compile
X.Y.Tools.MyTool(...) // will compile but ugly
有关如何解决此问题的建议或组织工具的其他方法吗?
答案 0 :(得分:1)
在这种情况下,您可以使用扩展方法。在导入该命名空间时,可以使用命名空间中的类中定义的所有扩展方法。
通过这种方式,您可以使用MyUtilityNamespace.MyClassInAssembly1
和MyUtilityNamespace.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
}
}
你会这样使用它:
Tool.T.SomeUtilityMethodX( Tool.T.SomeUtilityMethodY(), null );
它不漂亮,但意味着您只需要导入一次命名空间,而Tool.T
是常量,不需要记住StringTool
或NetworkTool
。
另一种方法是使用命名空间或类型别名,但是这很费力,因为您需要在每个源文件上指定using Tools = X.Y.Tools.MyTool;
行。
答案 1 :(得分:0)
结果证明,最简单的方法就是使用名称空间
// in project 1
namespace Tools {
public static class NetworkTool {
}
}
// in project 2
namespace Tools {
public static class FileTool {
}
}
// in client code (references both projects)
Tools.NetworkTool.SomeMethod();
Tools.FileTool.SomeMethod()