C# 通过反射根据描述特性转换枚举型值

假设我有两个枚举型,其中里面的字段并不一致,而且顺序也不一致,所以无法通过现有的转换方式转换,如果字段不一致,但是描述一致的话,我们可以通过反射获取两个枚举型各自的字段的描述特性,从而实现两个类型直接的转换

以下两个类型存在差异,如果直接转是不被允许的,结合反射的知识,我们可以实现该转换要求

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);

}

输出结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值