今日闲来无事,安装了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的中文注释是:创建用户成功。
好啦,就这样,代码在下面,这只是一个抛砖引玉的思路,谢谢大家支持。