强大的扩展方法和属性类(随记)

今日闲来无事,安装了VS2012,兴奋之余新建了一个MVC4的项目,看到代码中AccountController里面有这么一段代码:

        private static string ErrorCodeToString(MembershipCreateStatus createStatus)
        {
            // 请参见 http://go.microsoft.com/fwlink/?LinkID=177550 以查看
            // 状态代码的完整列表。
            switch (createStatus)
            {
                case MembershipCreateStatus.DuplicateUserName:
                    return "用户名已存在。请输入其他用户名。";

                case MembershipCreateStatus.DuplicateEmail:
                    return "该电子邮件地址的用户名已存在。请输入其他电子邮件地址。";

                case MembershipCreateStatus.InvalidPassword:
                    return "提供的密码无效。请输入有效的密码值。";

                case MembershipCreateStatus.InvalidEmail:
                    return "提供的电子邮件地址无效。请检查该值并重试。";

                case MembershipCreateStatus.InvalidAnswer:
                    return "提供的密码取回答案无效。请检查该值并重试。";

                case MembershipCreateStatus.InvalidQuestion:
                    return "提供的密码取回问题无效。请检查该值并重试。";

                case MembershipCreateStatus.InvalidUserName:
                    return "提供的用户名无效。请检查该值并重试。";

                case MembershipCreateStatus.ProviderError:
                    return "身份验证提供程序返回了错误。请验证您的输入并重试。如果问题仍然存在,请与系统管理员联系。";

                case MembershipCreateStatus.UserRejected:
                    return "已取消用户创建请求。请验证您的输入并重试。如果问题仍然存在,请与系统管理员联系。";

                default:
                    return "发生未知错误。请验证您的输入并重试。如果问题仍然存在,请与系统管理员联系。";
            }
        }

 一眼就可以看出,用于获取指定枚举值的中文意思,不至于单独写一个方法来处理这些信息吧,于是有了下面的成果:一个属性类,一个扩展方法。

先来属性类:

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GetDescription
{
    /// <summary>
    /// 用于描述字段或属性的注释属性类
    /// </summary>
    [AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)]
    public sealed class DescriptionAttribute : Attribute
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="description">字段描述信息</param>
        public DescriptionAttribute(String description)
        {
            this._description = description;
        }
        private string _description = string.Empty;
        /// <summary>
        /// 获取一个只,该值表示字段或属性描述信息
        /// </summary>
        public string Description
        {
            get
            {
                return _description.Trim();
            }
            private set
            {
                if (String.IsNullOrEmpty(value))
                {
                    this._description = value.Trim();
                }
                else
                {
                    throw new ArgumentNullException("参数不能为空!");
                }
            }
        }
    }
}

再来扩展方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace GetDescription
{
    /// <summary>
    /// 扩展方法类
    /// </summary>
    public static class Extentsions
    {
        /// <summary>
        /// 用于获取枚举注释的数据
        /// </summary>
        /// <param name="enums"></param>
        /// <returns></returns>
        public static String GetDescription(this Enum enums)
        {
            String ret = string.Empty;
            FieldInfo field = enums.GetType().GetField(enums.ToString());
            foreach (var item in field.CustomAttributes)
            {
                if (item.AttributeType == typeof(DescriptionAttribute))
                {
                    if (item.ConstructorArguments.Count > 0)
                    {
                        ret = item.ConstructorArguments[0].Value.ToString();
                    }
                    break;
                }
            }
            return ret.Trim();
        }
    }
}

我把MembershipCreateStatus枚举类型写成这样了:

View Code
    /// <summary>
    /// 描述 System.Web.Security.Membership.CreateUser(System.String,System.String)操作的结果。
    /// </summary>
    public enum MembershipCreateStatus
    {
        [Description("创建用户成功。")]
        Success = 0,
        [Description("在数据库中未找到用户名。")]
        InvalidUserName = 1,
        [Description("密码的格式设置不正确。")]
        InvalidPassword = 2,
        [Description("密码提示问题的格式设置不正确。")]
        InvalidQuestion = 3,
        [Description("密码提示问题答案的格式设置不正确。")]
        InvalidAnswer = 4,
        [Description("电子邮件地址的格式设置不正确。")]
        InvalidEmail = 5,
        [Description("用户名已存在于应用程序的数据库中。")]
        DuplicateUserName = 6,
        [Description("电子邮件地址已存在于应用程序的数据库中。")]
        DuplicateEmail = 7,
        [Description("因为提供程序定义的某个原因而未创建用户。")]
        UserRejected = 8,
        [Description("提供程序用户键值的类型或格式无效。")]
        InvalidProviderUserKey = 9,
        [Description("提供程序用户键值已存在于应用程序的数据库中。")]
        DuplicateProviderUserKey = 10,
        [Description("提供程序返回一个未由其他 System.Web.Security.MembershipCreateStatus 枚举值描述的错误。")]
        ProviderError = 11,
    }

在页面中,可以这样使用:

MembershipCreateStatus status = MembershipCreateStatus.Success;
Result.Text = "MembershipCreateStatus.Success的中文注释是:" + status.GetDescription();

Result是Web页面中的Literal控件。

最后的输出结果是:MembershipCreateStatus.Success的中文注释是:创建用户成功。

好啦,就这样,代码在下面,这只是一个抛砖引玉的思路,谢谢大家支持。

源代码

 

转载于:https://www.cnblogs.com/MrHuo/archive/2013/02/27/2935607.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值