我有一个奇怪的情况,我想更好地理解,以便我可以优雅地修复。
我有一个枚举,每个值的描述属性如下:
public enum LambdaPackageError : int
{
__packageOffset = 100,
// base errors
__base_offset = __packageOffset,
[Description("Base error 0")]
BaseError0 = __base_offset,
[Description("Base error 1")]
BaseError1 = __base_offset + 1,
[Description("Base error 2")]
BaseError2 = __base_offset + 2,
// extended errors
__extended_offset = __packageOffset + 10,
[Description("Extended error 0")]
ExtendedError0 = __extended_offset,
[Description("Extended error 1")]
ExtendedError1 = __extended_offset+ 1
}
现在这是将附加在枚举条目上的描述的代码片段:
public string GetDescriptionAttribute<T>(T value)
{
var attr = typeof(T)
.GetField(value.ToString())
.GetCustomAttributes(typeof(DescriptionAttribute), false)
.Cast<DescriptionAttribute>()
.FirstOrDefault();
return attr?.Description;
}
这里没什么疯狂的
GetDescriptionAttribute<LambdaPackageError>(LambdaPackageError.BaseError2); // ==> Returns attribute, OK
GetDescriptionAttribute<LambdaPackageError>(LambdaPackageError.ExtendedError1); // ==> Returns attribute, OK
GetDescriptionAttribute<LambdaPackageError>(LambdaPackageError.__packageOffset); // ==> Returns nothing, OK
然而,这是奇怪的:
GetDescriptionAttribute<LambdaPackageError>(LambdaPackageError.BaseError0); // ==> Returns nothing. Wait .. what ?
当我检查上述状态的作用时,它实际上将其解析为LambdaPackageError.__base_offset
而不是LambdaPackageError.BaseError0
。
显而易见的是,它们= 100
幕后具有相同的价值,但这不是我要求的方法给我的。
关于如何在这种情况下获得正确的描述属性的任何想法(除了更改内在枚举值(?我没有看到任何方法重载可以在该范围内帮助我..
感谢您提供一些信息。
请记住,enum
实际上只是美化的整数。因此,当您传入LambdaPackageError.BaseError0
时,解析为100,这变为LambdaPackageError.__packageOffset
或LambdaPackageError.__base_offset
(我不确定实际选择哪个规则是什么(
看起来您正在使用偏移量作为基本值来启动枚举值,但我怀疑您没有在代码中的其他地方使用它。因此,我建议将该值作为私有值移出const
,例如:
private const int __packageOffset = 100;
private const int __base_offset = __packageOffset;
private const int __extended_offset = __packageOffset + 10;
public enum LambdaPackageError : int
{
[Description("Base error 0")]
BaseError0 = __base_offset,
[Description("Base error 1")]
BaseError1 = __base_offset + 1,
[Description("Base error 2")]
BaseError2 = __base_offset + 2,
// extended errors
[Description("Extended error 0")]
ExtendedError0 = __extended_offset,
[Description("Extended error 1")]
ExtendedError1 = __extended_offset + 1
}