У меня есть строковое свойство, которое я хотел бы иметь с помощью двух вещей:
- Он может быть установлен только на определенные значения в заранее определенном списке,
- Проверка ошибок значения свойства может быть выполнена во время компиляции.
Перечисление отлично подходит для счета, за исключением того, что в моем списке предопределенных строк есть строка с дефисом, а значения перечисления не могут содержать дефисы . Чтобы проиллюстрировать идеальное решение, если перечисление может содержать дефисы, я бы создал перечисление:
public enum SIPEventPackagesEnum
{
dialog,
message-summary,
refer
}
Для использования:
SIPEventPackagesEnum EventPackage = SIPEventPackagesEnum.message-summary;
Для установки:
string eventPackageStr = "message-summary";
SIPEventPackagesEnum EventPackage = (SIPEventPackagesEnum)Enum.Parse(typeof(SIPEventPackagesEnum), eventPackageStr, true);
В вышеупомянутых случаях невозможно установить для свойства EventPackage что-либо, кроме одного из значений перечисления, и его использование интуитивно понятно, поскольку intellisense перечислит доступные параметры.
Из-за невозможности использования дефиса, и я не могу изменить предопределенный список, чтобы удалить дефис, очень грубый подход состоит в том, чтобы использовать структуру и иметь свойство «Значение» в структуре, которое выполняет принудительное выполнение в его установщик, см. ниже. Это очень многословно по сравнению с использованием enum, а также не позволяет проверять время компиляции и не очень интуитивно понятно.
Кто-нибудь сталкивался с этой проблемой раньше и есть лучшее решение? У меня есть несколько списков с элементами, содержащими дефисы, так что это не один раз.
public struct SIPEventPackages
{
public const string DIALOG = "dialog";
public const string MESSAGE_SUMMARY = "message-summary";
public const string REFER = "refer";
public string Value
{
get { return Value; }
set
{
if (IsValid(value))
{
Value = value.ToLower();
}
else
{
throw new ArgumentException(value + " is invalid for a SIP event package.");
}
}
}
public bool IsValid(string value)
{
if (value.IsNullOrBlank())
{
return false;
}
else if (value.ToLower() == DIALOG || value.ToLower() == MESSAGE_SUMMARY || value.ToLower() == REFER)
{
return true;
}
else
{
return false;
}
}
public override string ToString()
{
return Value;
}
}