gpt4 book ai didi

c# - 跨程序集模拟部分类

转载 作者:行者123 更新时间:2023-12-05 04:18:25 24 4
gpt4 key购买 nike

我试图将许多辅助类组合到一个通用的父类中以便于使用。例如,在我的应用程序中我想做

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

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

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

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

即在应用代码中

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

关于如何解决这个问题或组织工具的替代方法有什么建议吗?

最佳答案

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

通过这种方式,您将拥有像 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 是常量,不需要记住 StringTool网络工具

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

关于c# - 跨程序集模拟部分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15048362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com