У меня небольшая проблема. У меня есть часть мониторинга приложений в структуре, которая используется несколькими приложениями.
Прямо сейчас у меня есть такая функциональность:
public enum Vars
{
CPU,
RAM
}
public void Add(Vars variable, object value)
{
[...]
}
Переменная, которая используется как параметр в методе Add, будет использоваться как имя записи в базе данных. Теперь у меня появилось требование, чтобы приложения могли указывать собственные переменные вне фреймворка. Поскольку вы не можете наследовать от перечисления, это вызывает некоторые проблемы.
Я вижу в основном 2 возможности (которые, на мой взгляд, не очень удобны для ботов), чтобы решить эту проблему.
Возможность 1:
public void Add(enum variable, object value)
Этот метод принимает все виды перечислений, поэтому пользователи могут использовать перечисления Vars, а также перечисления, которые они определили сами. Проблема с этим решением: возможно, что пользователи будут использовать одни и те же имена как в .. приложении, так и во фреймворке. Я не могу различать два перечисления со значением «CPU» (Framework может хранить процентные значения как «CPU», приложение может сохранять использование процессора как «CPU»).
Возможность 2:
Второй метод будет классом вместо перечисления, например:
public class Vars
{
public const string CPU = "CPU";
public const string RAM = "RAM";
}
Из минусов тут: 1. Больше писать. 2. Мне нужно было бы определить параметры как строки:
public void Add(string variable, object value);
Это также может привести к неправильному использованию (приложения, которые добавляют строки напрямую, вместо определения класса, наследуемого от Vars).
Любые мысли о том, как определить модель, которая:
- Может быть унаследовано (для расширения значений значениями, специфичными для приложения)
- Может использоваться как параметр
- Гарантирует, что нет двойных (= одно и то же значение) записей?
1 ответ
Контекст не совсем понятен, но как насчет создания класса
public class Vars
{
public static Vars CPU = Vars.Get("CPU", 1);
public static Vars RAM = Vars.Get("RAM", 2);
//You can keep one of the params, name or id
private Vars(string name, int id)
{
...
}
public static Vars Get(string name, int id)
{
//check if id or name exists in static dictionary, and return that instance or create new one
}
}
public void Add(Vars variable, object value);
Теперь пользователь может создать любой параметр и перейти к методу,
Vars newVar = Vars.Get("MyNewParam", 10);
Вы можете легко проверить, является ли переданный параметр тем, о котором вы знаете
Метод Get возвращает тот же экземпляр, если параметры совпадают
HashMap<string>
и добавьте туда все значения name
. Если значение уже существует, может быть сгенерировано исключение.
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.