2

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

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

这里的想法是将所有工具组织在一个公共工具类下,以便智能感知可以在我键入“工具”时将它们全部显示出来。

在父静态部分类工具下定义所有工具工作正常,但不适用于不同程序集中的工具。

我试图通过用命名空间 XYTools 替换父工具类来模拟程序集之间的静态部分类,但是对于在 XY 命名空间之外编写的代码,我需要在使用它之前完全限定每个工具。

即在应用程序代码中

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

有什么建议可以解决这个问题或组织工具的替代方法吗?

4

2 回答 2

2

在这种情况下,您可以使用扩展方法。导入命名空间时,命名空间内的类中定义的所有扩展方法都可用。

这样,您将拥有像这样的静态类,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是恒定的,不需要记住StringToolNetworkTool.

另一种选择是使用命名空间或类型别名,但是这很费力,因为您需要在using Tools = X.Y.Tools.MyTool;您拥有的每个源文件上指定行。

于 2013-02-24T05:50:55.333 回答
1

事实证明,最简单的方法就是使用命名空间

 // 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()
于 2019-02-27T10:08:49.833 回答