Enum возвращает без пробелов
Пытаюсь получить массив или лист значений из Enum и затем сравнить со string. Проблема в том что значения я получаю, однако в массив они вносятся без пробелов, в результате чего я не могу сравнивать, поскольку в оригинальных строках есть пробелы, а из Enum получаю "однустроку" , хотя должно быть "одна строка"
Enum:
enum AccountType
{
[EnumMember(Value = "Reservations")]
Reservations = 0,
[EnumMember(Value = "Corporate/Member Accounts")]
CorporateOrMemberAccounts = 1,
[EnumMember(Value = "Unit Owners")]
UnitOwners = 2
}
Result:
var attr = Enum.GetNames(typeof(AccountType)); // ["Reservations", "CorporateOrMemberAccounts", "UnitOwners"]
Как это поправить красиво?
Ответы (3 шт):
private static string GetValue(AccountType type)
{
var enumType = typeof(AccountType);
var memberInfos = enumType.GetMember(type.ToString());
var enumValueMemberInfo = memberInfos.FirstOrDefault(m => m.DeclaringType == enumType);
var valueAttributes =
enumValueMemberInfo.GetCustomAttributes(typeof(EnumMemberAttribute), false);
return ((EnumMemberAttribute)valueAttributes[0]).Value;
}
public static void Main(string[] args)
{
Console.WriteLine(GetValue(AccountType.CorporateOrMemberAccounts)); //Corporate/Member Accounts
}
Вы получаете названия полей, а не их аттрибуты. То есть проблема не связана с пробелами вообще.
Linq и Reflection - эта ядерная смесь достанет вам что угодно и откуда угодно.
string[] attr = typeof(AccountType)
.GetFields()
.Select(f => f.GetCustomAttributes(typeof(EnumMemberAttribute), false))
.Where(a => a.Length > 0)
.Select(a => ((EnumMemberAttribute)a[0]).Value)
.ToArray();
Console.WriteLine(string.Join(Environment.NewLine, attr));
Вывод в консоль
Reservations
Corporate/Member Accounts
Unit Owners
Но для таких данных я бы не стал использовать enum, а сразу какой-нибудь Dictionary, потому что в случае с enum придется редактировать код и пересобирать приложение. Лучше храните эти типы в базе данных, чтобы при случае можно было бы их туда оперативно добавить и через внешний ключ вяжитесь к табличке с ними.
Зайдём с другой стороны.
Суть вопроса - как сравнивать строки, содержащие и не содержащие пробелы?
Используем одну из перегрузок метода String.Compare, которая принимает параметр CompareOptions. Задаём CompareOptions.IgnoreSymbols:
Console.WriteLine(string.Compare(
"Corporate/Member Accounts",
"Corporate/MemberAccounts",
null,
CompareOptions.IgnoreSymbols)
);
Выведет 0 - то есть строки равны.
При необходимости укажите нужную культуру (вместо null).
PS: удалить пробелы с помощью .Replace(" ", "") слишком просто, поэтому отметём его с негодованием.