获取自定义属性让我错误的属性



我有一个奇怪的情况,我想更好地理解,以便我可以优雅地修复。

我有一个枚举,每个值的描述属性如下:

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.__packageOffsetLambdaPackageError.__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
}

最新更新