模拟程序集中的部分类

时间:2013-02-24 03:34:17

标签: c# .net

我正在尝试将许多帮助程序类组合到一个公共父类中以便于使用。例如,在我想要的应用程序中

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

有关如何解决此问题的建议或组织工具的其他方法吗?

2 个答案:

答案 0 :(得分: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
    }
}

你会这样使用它:

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

它不漂亮,但意味着您只需要导入一次命名空间,而Tool.T是常量,不需要记住StringToolNetworkTool

另一种方法是使用命名空间或类型别名,但是这很费力,因为您需要在每个源文件上指定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()