.net 中属性转换为对应的解释,怎么写最好?

danmali 上海华谊工程有限公司 数据库工程师/管理员  2016-09-01 04:08:27
在一个类的属性中,如果存在 bool、enum 等属性,怎样写能更好将对应的解释输出,同时在转换成Json的时候也能获取。

public enum CustomStatus
{
/// <summary>
/// 草稿状态
/// </summary>
Draft = 0,
/// <summary>
/// 已提交,待审批完成
/// </summary>
Wait = 5,
/// <summary>
/// 审批通过
/// </summary>
Agree = 10,
/// <summary>
/// 审批拒绝
/// </summary>
Reject = 15
}

public class Demo
{
public CustomStatus Status{get;set;}

public string CustomStatusDisplay{
get
{
switch (this.Status)
{
case CustomStatus .Draft:
return "草稿";
case CustomStatus .Wait:
return "待审批";
case CustomStatus .Agree:
return "审批通过";
case CustomStatus .Reject:
return "审批拒绝";
default:
return "未知状态";

}
}
}
}


如果调用需要 new Demo().CustomStatusDisplay; 这样就多写了一个只读属性CustomStatusDisplay,而且名称看起来野怪别扭的,大家也都是这么写的吗?还有什么更好的方法?
...全文
229 点赞 收藏 11
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
showjim 2016-09-02
定义一个通用的结构体
        /// <summary>
        /// Enum 绑定 Attribute
        /// </summary>
        /// <typeparam name="EnumType"></typeparam>
        /// <typeparam name="AttributeType"></typeparam>
        public struct EnumAttribute<EnumType, AttributeType>
            where EnumType : IConvertible
            where AttributeType : Attribute
        {
            private EnumType enumValue;
            public EnumType EnumValue
            {
                get { return enumValue; }
                set
                {
                    this.enumValue = value;
                    set();
                }
            }
            public AttributeType AttributeValue { get; private set; }
            public static implicit operator EnumAttribute<EnumType, AttributeType>(EnumType enumValue)
            {
                return new EnumAttribute<EnumType, AttributeType>(enumValue);
            }
            public static implicit operator EnumType(EnumAttribute<EnumType, AttributeType> value)
            {
                return value.EnumValue;
            }
            public EnumAttribute(EnumType enumValue, AttributeType defaultAttribute = null)
            {
                this.enumValue = enumValue;
                AttributeValue = defaultAttribute;
                set();
            }
            private void set()
            {
                #region 这里只是示例,这一段自己做优化
                FieldInfo field = typeof(EnumType).GetField(EnumValue.ToString(), BindingFlags.Public | BindingFlags.Static);
                if (field != null)
                {
                    foreach (object attribute in field.GetCustomAttributes(typeof(AttributeType), false))
                    {
                        AttributeValue = attribute as AttributeType;
                        break;
                    }
                }
                #endregion
            }
        }
定义一个自定义属性用于描述 Enum
        public enum CustomStatus
        {
            /// <summary>
            /// 草稿状态
            /// </summary>
            [CustomStatusAttribute(Display = "草稿")]
            Draft = 0,
            /// <summary>
            /// 已提交,待审批完成
            /// </summary>
            [CustomStatusAttribute(Display = "待审批")]
            Wait = 5,
            /// <summary>
            /// 审批通过
            /// </summary>
            [CustomStatusAttribute(Display = "审批通过")]
            Agree = 10,
            /// <summary>
            /// 审批拒绝
            /// </summary>
            [CustomStatusAttribute(Display = "审批拒绝")]
            Reject = 15
        }
        public sealed class CustomStatusAttribute : Attribute
        {
            public string Display;
            public static readonly CustomStatusAttribute Null = new CustomStatusAttribute { Display = "未知状态" };
        }
        public class Demo
        {
            public EnumAttribute<CustomStatus, CustomStatusAttribute> Status { get; set; } = CustomStatus.Agree;
        }
回复
yang1216 2016-09-02
public enum CustomStatus { /// <summary> /// 草稿状态 /// </summary> [Description("草稿")] Draft, 。。。 } 然后取属性,不过反射起来效率可能不高
回复
每种枚举都有基础类型,一般默认是int,但是不一定一定要用int,你这种情况可以用string作为枚举的基础类型

public enum CustomStatus
    {
        /// <summary>
        /// 草稿状态
        /// </summary>
        Draft = "草稿",
        /// <summary>
        /// 已提交,待审批完成
        /// </summary>
        Wait = "已提交",
        /// <summary>
        /// 审批通过
        /// </summary>
        Agree = "审批通过",
        /// <summary>
        /// 审批拒绝
        /// </summary>
        Reject = "审批拒绝"
    }
然后用调用ToString就可以得到你要的字符了。
回复
danmali 2016-09-02
引用 4 楼 meiguo520 的回复:
万年不变的东西,可以用这个来实现,如果是活的东西,你就不要停的加,不停的翻译。 数据字典可能会更快捷些。
有没有好一点的数据字典的模式文章推荐,数据字典正规是怎么处理的模式?谢谢
回复
bb_Sam 2016-09-02
用attribute吧,把解释定义到description,需要显示这个解释的地方调用就行了,给个方法给你参考:

public static class Utils
{
	public static string GetEnumDescription<T>(T value)
	{
		var type = typeof(T);
		var name = Enum.GetName(type, value);
		if (name == null)
			return null;

		var memberInfo = type.GetMember(name);
		if (memberInfo.Length != 0)
		{
			var attrs = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
			if (attrs.Length != 0)
			{
				var attr = attrs[0] as DescriptionAttribute;
				if (attr != null)
					return attr.Description;
			}
		}
		return null;
	}
}

public enum CustomStatus
{
	[Description("草稿状态")]
	Draft = 0,
	[Description("已提交,待审批完成")]
	Wait = 5,
	[Description("审批通过")]
	Agree = 10,
	[Description("审批拒绝")]
	Reject = 15
}

class Program
{
	static void Main(string[] args)
	{
		Console.WriteLine(Utils.GetEnumDescription(CustomStatus.Draft));  // 输出就是“草稿状态”
	}
}
回复
引用 7 楼 yang1216 的回复:
public enum CustomStatus { /// <summary> /// 草稿状态 /// </summary> [Description("草稿")] Draft, 。。。 } 然后取属性,不过反射起来效率可能不高
用attribute是正解
回复
万年不变的东西,可以用这个来实现,如果是活的东西,你就不要停的加,不停的翻译。 数据字典可能会更快捷些。
回复
Poopaye 2016-09-01
是要做多国吗?通常都是资源里配字符串
回复
cheng2005 2016-09-01
正轨的项目面对这种需求都是自己构造一套完整的数据字典体系。而不是靠着编程语言的枚举或者数据类型来做事。
回复
public enum CustomStatus
    {
        /// <summary>
        /// 草稿状态
        /// </summary>
        草稿 = 0,
        /// <summary>
        /// 已提交,待审批完成
        /// </summary>
        待审批 = 5,
        /// <summary>
        /// 审批通过
        /// </summary>
        审批通过 = 10,
        /// <summary>
        /// 审批拒绝
        /// </summary>
        审批拒绝 = 15
    }
回复
发动态
发帖子
C#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.