其中提供枚举操作方法
本文关键字:枚举 操作方法 | 更新日期: 2023-09-27 18:36:55
我有几个枚举:
public class ClassA
{
public enum A {a, b, c, d};
public class ClassB
{
public enum B {b1, b2, b3, b4};
public enum C {c1, c2, c3};
}
// ...
}
现在我需要对枚举执行一些操作,例如:
返回枚举的全部或部分成员的列表;
将枚举转换为文本(例如,
A.a
应向用户显示为"条件 A",B.b1
显示为"选项 1")
我的问题是组织这些方法。
有很多枚举,我需要将方法链接到其中的一些枚举
问:在哪里存储用于在应用程序中操作不同枚举的方法?
我应该为每个枚举创建一个类吗?或者使用自定义类来操作所有枚举和具有相应枚举名称的名称方法?
Enum
不是一个类,它不能容纳静态方法,理想情况下我希望它们在里面。这将非常方便,每当我能够输入A.
并且智能会为我提供:
a, b, c, d, A[] FilterValues(bool condition), string[] AllValuesTranslated(), string TranslateMembmer(A member)
我希望这个问题很清楚(不知道如何解释我需要更短的内容,对不起)。
以下是一些有用的实用程序扩展方法:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
用法:
var listOfValues = typeof (A).ToList();
var listOfKeyValuePairs = typeof(A).ToListOfKeyValuePair();
var dictionaryOfValues = typeof(A).ToDictionary();
给定以下枚举:
public enum A
{
[EnumValueDescription("This is a")] a = 1,
[EnumValueDescription("This is b")] b = 2,
[EnumValueDescription("This is c")] c = 3,
[EnumValueDescription("This is d")] d = 4
};
以及以下自定义属性:
[AttributeUsage(AttributeTargets.Enum | AttributeTargets.Field, AllowMultiple = false)]
public class EnumValueDescriptionAttribute : Attribute
{
public string StringValue
{
get;
protected set;
}
public EnumValueDescriptionAttribute(string value)
{
this.StringValue = value;
}
}
以及以下扩展方法:
public static class EnumExtentions
{
public static List<Enum> ToList(this Type type)
{
return Enum.GetValues(type)
.OfType<Enum>()
.ToList();
}
public static Dictionary<int, string> ToDictionary(this Type type)
{
return type.GetEnumValues().Cast<Enum>().ToDictionary(Convert.ToInt32, e => e.GetDescription());
}
public static List<KeyValuePair<int, string>> ToListOfKeyValuePair(this Type type)
{
return Enum.GetValues(type)
.OfType<Enum>()
.Select(e => new KeyValuePair<int, string>(Convert.ToInt32(e), e.GetDescription()))
.ToList();
}
public static string GetDescription(this Enum value)
{
return value.GetDescription(null);
}
public static string GetDescription(this Enum value, string defaultValue)
{
var allFields = value.GetType().GetFields();
if (!allFields.Any())
return defaultValue;
var targetField = allFields.FirstOrDefault(fi => (fi.IsLiteral && (fi.GetValue(null).Equals(value))));
if (targetField == null)
return defaultValue;
var attrib = targetField.GetCustomAttributes(typeof(EnumValueDescriptionAttribute), false)
.OfType<EnumValueDescriptionAttribute>()
.FirstOrDefault();
return attrib == null ? defaultValue : attrib.StringValue;
}
}
目前还不完全清楚您需要哪些其他操作方法。