반응형
설명에서 Enum 특성 가져오기
중복 가능성:
Description Attribute를 사용하여 열거값
나는 다음을 얻는 일반적인 확장 방법을 가지고 있습니다.Description의 속성.Enum:
enum Animal
{
[Description("")]
NotSet = 0,
[Description("Giant Panda")]
GiantPanda = 1,
[Description("Lesser Spotted Anteater")]
LesserSpottedAnteater = 2
}
public static string GetDescription(this Enum value)
{
FieldInfo field = value.GetType().GetField(value.ToString());
DescriptionAttribute attribute
= Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute))
as DescriptionAttribute;
return attribute == null ? value.ToString() : attribute.Description;
}
그래야 내가...
string myAnimal = Animal.GiantPanda.GetDescription(); // = "Giant Panda"
다른 방향으로 동등한 기능을 수행하려고 노력 중입니다. 마치...
Animal a = (Animal)Enum.GetValueFromDescription("Giant Panda", typeof(Animal));
public static class EnumEx
{
public static T GetValueFromDescription<T>(string description) where T : Enum
{
foreach(var field in typeof(T).GetFields())
{
if (Attribute.GetCustomAttribute(field,
typeof(DescriptionAttribute)) is DescriptionAttribute attribute)
{
if (attribute.Description == description)
return (T)field.GetValue(null);
}
else
{
if (field.Name == description)
return (T)field.GetValue(null);
}
}
throw new ArgumentException("Not found.", nameof(description));
// Or return default(T);
}
}
용도:
var panda = EnumEx.GetValueFromDescription<Animal>("Giant Panda");
확장 방법보다는 정적 방법을 몇 가지 시도해 보십시오.
public static class Utility
{
public static string GetDescriptionFromEnumValue(Enum value)
{
DescriptionAttribute attribute = value.GetType()
.GetField(value.ToString())
.GetCustomAttributes(typeof (DescriptionAttribute), false)
.SingleOrDefault() as DescriptionAttribute;
return attribute == null ? value.ToString() : attribute.Description;
}
public static T GetEnumValueFromDescription<T>(string description)
{
var type = typeof(T);
if (!type.IsEnum)
throw new ArgumentException();
FieldInfo[] fields = type.GetFields();
var field = fields
.SelectMany(f => f.GetCustomAttributes(
typeof(DescriptionAttribute), false), (
f, a) => new { Field = f, Att = a })
.Where(a => ((DescriptionAttribute)a.Att)
.Description == description).SingleOrDefault();
return field == null ? default(T) : (T)field.Field.GetRawConstantValue();
}
}
여기서 사용
var result1 = Utility.GetDescriptionFromEnumValue(
Animal.GiantPanda);
var result2 = Utility.GetEnumValueFromDescription<Animal>(
"Lesser Spotted Anteater");
웹 서비스가 있는 경우를 제외하고는 솔루션이 제대로 작동합니다.
설명 속성은 직렬화할 수 없으므로 다음을 수행해야 합니다.
[DataContract]
public enum ControlSelectionType
{
[EnumMember(Value = "Not Applicable")]
NotApplicable = 1,
[EnumMember(Value = "Single Select Radio Buttons")]
SingleSelectRadioButtons = 2,
[EnumMember(Value = "Completely Different Display Text")]
SingleSelectDropDownList = 3,
}
public static string GetDescriptionFromEnumValue(Enum value)
{
EnumMemberAttribute attribute = value.GetType()
.GetField(value.ToString())
.GetCustomAttributes(typeof(EnumMemberAttribute), false)
.SingleOrDefault() as EnumMemberAttribute;
return attribute == null ? value.ToString() : attribute.Value;
}
꽤 간단해야 합니다. 이전 방법과 반대입니다.
public static int GetEnumFromDescription(string description, Type enumType)
{
foreach (var field in enumType.GetFields())
{
DescriptionAttribute attribute
= Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute))as DescriptionAttribute;
if(attribute == null)
continue;
if(attribute.Description == description)
{
return (int) field.GetValue(null);
}
}
return 0;
}
용도:
Console.WriteLine((Animal)GetEnumFromDescription("Giant Panda",typeof(Animal)));
연장할 수 없습니다.Enum정적인 수업이기 때문에.유형의 인스턴스만 확장할 수 있습니다.이러한 점을 염두에 두고, 이 작업을 수행하려면 정적 메서드를 직접 만들어야 합니다. 기존 메서드와 결합하면 다음 작업이 수행됩니다.GetDescription:
public static class EnumHelper
{
public static T GetEnumFromString<T>(string value)
{
if (Enum.IsDefined(typeof(T), value))
{
return (T)Enum.Parse(typeof(T), value, true);
}
else
{
string[] enumNames = Enum.GetNames(typeof(T));
foreach (string enumName in enumNames)
{
object e = Enum.Parse(typeof(T), enumName);
if (value == GetDescription((Enum)e))
{
return (T)e;
}
}
}
throw new ArgumentException("The value '" + value
+ "' does not match a valid enum name or description.");
}
}
그리고 그 사용법은 다음과 같습니다.
Animal giantPanda = EnumHelper.GetEnumFromString<Animal>("Giant Panda");
동물의 모든 열거값을 반복하고 필요한 설명과 일치하는 값을 반환해야 합니다.
언급URL : https://stackoverflow.com/questions/4367723/get-enum-from-description-attribute
반응형
'codememo' 카테고리의 다른 글
| OS X에서 환경 변수 설정 (0) | 2023.05.03 |
|---|---|
| 의 기준 매개 변수와 출력 매개 변수 간의 차이입니다.그물 (0) | 2023.05.03 |
| C#에서 메서드 그룹이란 무엇입니까? (0) | 2023.05.03 |
| 브라우저에서 Azure Blob Storage에 직접 파일을 업로드하시겠습니까? (0) | 2023.05.03 |
| ASP에서 환경 변수를 읽습니다.NET 코어 (0) | 2023.05.03 |