【问题标题】:How can I call utility methods statically with a chain of classes?如何使用类链静态调用实用程序方法?
【发布时间】:2020-02-26 21:42:14
【问题描述】:

我有一个“通用”项目的解决方案。此“通用”项目被解决方案中的其他项目使用。

在这个“Common”项目中,我有一个“Utilities”文件夹,其中包含几个不同的实用程序类,例如“CsvUtilities.cs”和“JsonUtilities.cs”。假设我可以有很多这样的类,并且这些类中的所有方法都是纯函数。基于此,这些类和方法是静态的是有意义的。然后从其他项目中,我可以导入公共项目并执行以下操作:

CsvUtilities.StaticCsvMethod();
JsonUtilities.StaticJsonMethod();

这行得通,我认为这是比较正常的。

现在复杂的是我想创建一个层次结构来访问静态实用程序方法。我希望能够输入“实用程序”。在 IDE 中并让智能感知显示所有现有的实用程序类,然后是该实用程序类中的所有方法。

所以我想要的代码如下所示:

Utilities.Csv.StaticCsvMethod();
Utilities.Json.StaticJsonMethod();

我通过以下方式实现了这个想法:

public static class Utilities
{
    public static CsvUtilities Csv { get; } = new CsvUtilities();
    public static JsonUtilities Json { get; } = new JsonUtilities();
}

但是,这个解决方案存在一个大问题。为此,各种实用程序类及其方法必须不再是静态的,这对于实用程序类/方法来说很尴尬。

我找不到其他人这样做的例子。我使用这个“实用程序”的最合理的方式是什么。结构,同时还保持实用程序类/方法静态?

【问题讨论】:

  • 通过使用Namespaces 或部分嵌套类?
  • 你可以做嵌套的静态类。
  • 我更喜欢命名空间而不是类。类并不是真的只是对其他类进行分类。另一方面,命名空间基本上是。
  • 为什么在呼叫站点使用该层次结构很重要?就这样Utilities 可以用作 IntelliSense 中的快捷方式吗?但是,通常情况下,类型的组织在使用它们时是无关紧要的,因为无论如何您都会使用using 导入它们;也就是说,您在使用时看不到完整或部分命名空间,因为没有必要。

标签: c# static-methods utility-method


【解决方案1】:

您可以使用命名空间(或嵌套类)来嵌套您的调用。看下面的例子

namespace Utilities
{
    public static class Json
    {
        public static void StaticJsonMethod()
        {
            // Do something
        }
    }
}

您可以使用Utilities.Json.StaticJsonMethod() 调用该方法。

要添加另一个级别,只需将“类别”附加到命名空间:

namespace Utilities.Formats
{
    public static class Json
    {
        public static void StaticJsonMethod()
        {
            // Do something
        }
    }
}

您可以使用Utilities.Formats.Json.StaticJsonMethod() 调用该方法

【讨论】:

  • 我同意这可行,我喜欢这个想法。但是,这意味着命名空间不会遵循项目结构,这很糟糕吗?例如,如果它在一个名为“Common”的项目中,那么我希望命名空间也以“Common”开头。另外,我是否应该担心这个命名空间可能与其他库发生冲突,因为这个名字太通用了?
【解决方案2】:

如果您将静态类 Json 嵌套在 Utilities 中,则可以拥有 Utilities.Json.StaticJsonMethod();

public static class Utilities 
{
    public static class Json
    {
         public static void StaticJsonMethod() { }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 2014-02-12
    • 2017-05-19
    • 2015-09-26
    • 2023-04-05
    相关资源
    最近更新 更多