前几天有同事问到我一个简单的功能 就是当你使用枚举时如何给每个一元素增加描述字符串并且可以很容易的读取出来
比如有一个枚举类型是列出对一个问题给出的选项(例如 同意?不同意?中立?)
public enum AssessmentAnswer
{
Strongly_Disagree =
Disagree =
Neutral =
Agree =
Strongly_Agree =
}
当选择不同的答案时 希望得到一些描述性的语句比方说 强烈的反对 反对 持中立观点 同意 完全的同意 当然你可以建立一个表格存放这些信息 但是我想起几年前我在网上一个 EnumDescription (忘记了是在哪里下载的) 就可以实现这一功能 让我们一起来看看是怎么样用 Extension 做到的 实现 首先定义一个EnumDescription 类
public class EnumDescription : Attribute
{
public string Text
{
get { return _text; }
} private string _text;
public EnumDescription(string text)
{
_text = text;
}
}
注意它的父类是Attribute 因为我们希望将描述的语句作为每一个对应元素的特性 然后新建一个文件命名EnumExtensionscs
public static class EnumExtensions
{
public static string ToDescription(this Enum enumeration)
{
Type type = enumerationGetType()
MemberInfo[] memInfo = typeGetMember(enumerationToString())
if (null != memInfo && memInfoLength > )
{
object[] attrs = memInfo[]GetCustomAttributes(typeof(EnumDescription) false)
if (null != attrs && attrsLength > )
return ((EnumDescription)attrs[])Text;
}
return enumerationToString()
}
}
在这里我们定义了一个扩展函数ToDescription 就像所有的扩展函数一样它的参数是类似(this …)
这个函数首先用GetType 得到了当前枚举的类型 然后借助 GetMember按照元素的名字(值) 得到这个特定的元素 最后用GetCustomAttributes 得到描述的内容
这个扩展函数实现后我们可以修改枚举的定义加入描述
public enum AssessmentAnswer { [EnumDescription(强烈的反对)] Strongly_Disagree =
[EnumDescription(反对)]
Disagree =
Neutral =
Agree =
[EnumDescription(完全的同意)]
Strongly_Agree =
}
当要获取描述语句时 你可以轻松的调用ToDescription :
//返回 强烈的反对
AssessmentAnswerStrongly_DisagreeToDescription()
注意 如果没有给元素加入特性 你仍旧可以使用ToDescription 可以参考上面的代码看看是为什么
//返回 Disagree
AssessmentAnswerDisagreeToDescription()
总结
扩展方法作为特殊的静态方法使您能够向现有类型添加方法而无需创建新的派生类型重新编译或以其他方式修改原始类型
对于用 和 Visual Basic 编写的客户端代码调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异
给初学者的话 一旦当你实现扩展方法后 你只需要复制dll 添加文件命名空间 或者复制cs文件到你的项目中 就可以使用这些方法 但是建议除非你有充分的理由才实现扩展方法
很多我们要用到的扩展方法都可以在网上得到 所以一般在写自己的扩展前请先搜索一下