假设我有两个枚举型,其中里面的字段并不一致,而且顺序也不一致,所以无法通过现有的转换方式转换,如果字段不一致,但是描述一致的话,我们可以通过反射获取两个枚举型各自的字段的描述特性,从而实现两个类型直接的转换
以下两个类型存在差异,如果直接转是不被允许的,结合反射的知识,我们可以实现该转换要求
public enum GeometryType
{
[Description("无")]
None,
[Description("线")]
Line,
[Description("点")]
Point,
[Description("圆")]
Circle
}
public enum CustomGeometryType
{
[Description("无")]
NONE,
[Description("点")]
POINT,
[Description("线")]
POLYLINE,
}
核心代码如下:
/// <summary>
/// 根据描述特性转换枚举类型
/// </summary>
static T EnumConvertByDescriptionAttribute<T>(object value) where T : Enum
{
if (value == null)
return default(T);
var type = value.GetType();
var field = type.GetField(value.ToString());//获取字段
var attri = field.GetCustomAttribute(typeof(DescriptionAttribute)) as DescriptionAttribute;//获取改字段对应的description特性
var fields = typeof(T).GetFields(BindingFlags.Public | BindingFlags.Static);//要被赋值的枚举型的所有字段,括号里面的参数可以排除枚举型固有的字段
var newField = fields.FirstOrDefault(p => (p.GetCustomAttribute(typeof(DescriptionAttribute)) as DescriptionAttribute)?.Description == attri?.Description);//根据字段的描述去要赋值的枚举型的里面的字段找相同的字段描述
if (newField == null)
return default(T);
T newValue = (T)Enum.Parse(typeof(T), newField.Name);//根据字段的名字转成要赋值的枚举型的类型值
return newValue;
}
调用示例:
void Main()
{
EnumConvertByDescriptionAttribute<CustomGeometryType>(GeometryType.Line);
}
输出结果: