Как я могу вызывать служебные методы статически с цепочкой классов?

У меня есть решение с "Общим" проектом. Этот «общий» проект используется другими проектами в решении.

В этом «Общем» проекте у меня есть папка «Утилиты» с несколькими разными классами утилит, например, «CsvUtilities.cs» и «JsonUtilities.cs». Предположим, что у меня может быть много таких классов и что все методы в этих классах являются чистыми функциями. Исходя из этого, было бы разумно, чтобы эти классы и методы были статическими. Затем из других проектов я могу импортировать общий проект и делать такие вещи, как:

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

Это работает, и я думаю, что это относительно нормально.

Теперь сложность заключается в том, что я хочу создать иерархическую структуру для доступа к статическим служебным методам. Я хочу иметь возможность набирать «Утилиты». в IDE, и Intellisense покажет все существующие служебные классы, за которыми следуют все методы в этом служебном классе.

Итак, код, который я хочу, будет выглядеть так:

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

Я реализовал эту идею, сделав следующее:

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

Однако с этим решением есть большая проблема. Чтобы это работало, различные служебные классы и их методы больше не должны быть статическими, что неудобно для служебных классов/методов.

Я не смог найти пример того, как кто-то еще делал что-то подобное. Как мне разумнее всего использовать эту "Утилиту". структура, сохраняя при этом статические классы/методы утилиты?


person user3847931    schedule 26.02.2020    source источник
comment
Используя Namespaces или частично вложенные классы?   -  person Sani Singh Huttunen    schedule 27.02.2020
comment
Вы можете делать вложенные статические классы.   -  person juharr    schedule 27.02.2020
comment
Я бы предпочел пространства имен классам. Классы на самом деле не предназначены для того, чтобы просто классифицировать другие классы. Пространства имен, с другой стороны, в основном таковы.   -  person Broots Waymb    schedule 27.02.2020
comment
Почему важно, чтобы эта иерархия использовалась на месте вызова? Чтобы Utilities можно было использовать как ярлык в IntelliSense? Как правило, организация типов не имеет значения при их использовании, потому что вы в любом случае импортируете их с помощью using; то есть вы не видите полного или частичного пространства имен в момент использования, потому что в этом нет необходимости.   -  person Lance U. Matthews    schedule 27.02.2020


Ответы (2)


Вы можете использовать пространства имен (или вложенные классы) для вложения таких вызовов. См. следующий пример

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()

person Dávid Kaya    schedule 26.02.2020
comment
Я согласен, что это сработает, и мне нравится эта идея. Но разве это плохо, что это означает, что пространство имен не будет следовать структуре проекта? Например, если он находится в проекте с именем Common, я ожидаю, что пространство имен также будет начинаться с Common. Кроме того, следует ли мне беспокоиться о том, что это пространство имен может конфликтовать с другими библиотеками из-за того, что имя является таким общим? - person user3847931; 27.02.2020

У вас может быть Utilities.Json.StaticJsonMethod();, если вы вложите статический класс Json внутрь Utilities

public static class Utilities 
{
    public static class Json
    {
         public static void StaticJsonMethod() { }
    }
}
person Yegor Androsov    schedule 26.02.2020