Seb*_*son 6 .net c# enums design-patterns anti-patterns
有人一直在谈论Enums一般违反清洁守则原则,所以我正在寻找人们最喜欢的Enum反模式和替代解决方案.
例如,我见过这样的代码:
switch(enumValue) {
case myEnum.Value1:
// ...
break;
case myEnum.Value2:
// ...
break;
}
Run Code Online (Sandbox Code Playgroud)
它比带有魔术字符串的switch语句更好一步,但这可能已经通过工厂,容器或其他模式更好地解决了.
甚至像这样的老派代码:
if(enumValue == myEnum.Value1) {
// ...
} else if (enumValue == myEnum.Value2) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
您对枚举有哪些其他反模式和更好的实现?
dan*_*els 11
我认为Enums非常有用.我为Enum写了一些扩展,为它的使用增加了更多的价值
首先,有Description扩展方法
public static class EnumExtensions
{
public static string Description(this Enum value)
{
var entries = value.ToString().Split(ENUM_SEPERATOR_CHARACTER);
var description = new string[entries.Length];
for (var i = 0; i < entries.Length; i++)
{
var fieldInfo = value.GetType().GetField(entries[i].Trim());
var attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
description[i] = (attributes.Length > 0) ? attributes[0].Description : entries[i].Trim();
}
return String.Join(", ", description);
}
private const char ENUM_SEPERATOR_CHARACTER = ',';
}
Run Code Online (Sandbox Code Playgroud)
这将允许我像这样定义en enum:
public enum MeasurementUnitType
{
[Description("px")]
Pixels = 0,
[Description("em")]
Em = 1,
[Description("%")]
Percent = 2,
[Description("pt")]
Points = 3
}
Run Code Online (Sandbox Code Playgroud)
通过这样做获得标签:( var myLabel = rectangle.widthunit.Description()
不需要任何switch
声明).
这将返回"px"如果rectangle.widthunit = MeasurementUnitType.Pixels
或它将返回"px,em"if rectangle.widthunit = MeasurementUnitType.Pixels | MeasurementUnitType.Em
.
然后,有一个
public static IEnumerable<int> GetIntBasedEnumMembers(Type @enum)
{
foreach (FieldInfo fi in @enum.GetFields(BindingFlags.Public | BindingFlags.Static))
yield return (int)fi.GetRawConstantValue();
}
Run Code Online (Sandbox Code Playgroud)
这将让我遍历任何基于int的值的枚举并返回int值本身.
我发现这些在一个已经有用的概念中非常有用.
归档时间: |
|
查看次数: |
4919 次 |
最近记录: |