В строке запроса у меня есть переменная возраста ?age=New_Born
.
Есть ли способ проверить, есть ли это строковое значение New_Born
в моем списке Enum.
[Flags]
public enum Age
{
New_Born = 1,
Toddler = 2,
Preschool = 4,
Kindergarten = 8
}
Сейчас я могу использовать оператор if, но если мой список Enum станет больше. Я хочу найти лучший способ сделать это. Я думаю использовать Linq, но не уверен, как это сделать.
Вы можете использовать enum.Метод tryparse:
Age age;
if (Enum.TryParse<Age>("New_Born", out age))
{
// You now have the value in age
}
Вы можете использовать метод TryParse, который в случае успеха возвращает true:
Age age;
if(Enum.TryParse<Age>("myString", out age))
{
//Here you can use age
}
Я знаю, что это старый нить, но здесь'ы немного другой подход, используя атрибуты перечисляет и затем вспомогательный класс, чтобы найти перечислить, что соответствует.
Таким образом, вы могли бы иметь несколько отображений на одном перечислить.
public enum Age
{
[Metadata("Value", "New_Born")]
[Metadata("Value", "NewBorn")]
New_Born = 1,
[Metadata("Value", "Toddler")]
Toddler = 2,
[Metadata("Value", "Preschool")]
Preschool = 4,
[Metadata("Value", "Kindergarten")]
Kindergarten = 8
}
Мой вспомогательный класс, как это
public static class MetadataHelper
{
public static string GetFirstValueFromMetaDataAttribute<T>(this T value, string metaDataDescription)
{
return GetValueFromMetaDataAttribute(value, metaDataDescription).FirstOrDefault();
}
private static IEnumerable<string> GetValueFromMetaDataAttribute<T>(T value, string metaDataDescription)
{
var attribs =
value.GetType().GetField(value.ToString()).GetCustomAttributes(typeof (MetadataAttribute), true);
return attribs.Any()
? (from p in (MetadataAttribute[]) attribs
where p.Description.ToLower() == metaDataDescription.ToLower()
select p.MetaData).ToList()
: new List<string>();
}
public static List<T> GetEnumeratesByMetaData<T>(string metadataDescription, string value)
{
return
typeof (T).GetEnumValues().Cast<T>().Where(
enumerate =>
GetValueFromMetaDataAttribute(enumerate, metadataDescription).Any(
p => p.ToLower() == value.ToLower())).ToList();
}
public static List<T> GetNotEnumeratesByMetaData<T>(string metadataDescription, string value)
{
return
typeof (T).GetEnumValues().Cast<T>().Where(
enumerate =>
GetValueFromMetaDataAttribute(enumerate, metadataDescription).All(
p => p.ToLower() != value.ToLower())).ToList();
}
}
затем вы можете сделать что-то подобное
var enumerates = MetadataHelper.GetEnumeratesByMetaData<Age>("Value", "New_Born");
И для полноты картины вот атрибут:
[AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = true)]
public class MetadataAttribute : Attribute
{
public MetadataAttribute(string description, string metaData = "")
{
Description = description;
MetaData = metaData;
}
public string Description { get; set; }
public string MetaData { get; set; }
}
Я've получили удобный метод расширения, который использует метод tryparse, как определен с учетом регистра.
public static bool IsParsable<T>(this string value) where T : struct
{
return Enum.TryParse<T>(value, true, out _);
}
Чтобы разобрать возраст:
Age age;
if (Enum.TryParse(typeof(Age), "New_Born", out age))
MessageBox.Show("Defined"); // Defined for "New_Born, 1, 4 , 8, 12"
Проверить, определен ли он:
if (Enum.IsDefined(typeof(Age), "New_Born"))
MessageBox.Show("Defined");
В зависимости от того, как вы планируете использовать перечисление Age
, флаги могут оказаться не тем, что нужно. Как вы, вероятно, знаете, [Flags]
указывает на то, что вы хотите разрешить несколько значений (как в битовой маске). IsDefined
вернет false для Age.Toddler | Age.Preschool
, потому что у него несколько значений.
Вы должны использовать перечислимый.Метод tryparse, чтобы достичь своей цели
Это пример:
[Flags]
private enum TestEnum
{
Value1 = 1,
Value2 = 2
}
static void Main(string[] args)
{
var enumName = "Value1";
TestEnum enumValue;
if (!TestEnum.TryParse(enumName, out enumValue))
{
throw new Exception("Wrong enum value");
}
// enumValue contains parsed value
}