C# 如何从Enum枚举取值传入自定义Attribute的属性参数?
你遇到的报错是因为C#特性的入参要求必须是编译时常量,LimitEnum.max.ToString()是运行时执行的方法,不属于编译时常量,因此无法通过编译。
以下是两种可实现需求的解决方案:
方案1:修改特性构造函数参数类型为枚举(最推荐)
直接把特性的入参类型从string改为你定义的LimitEnum,从根源上避免字符串传参,实现强类型校验:
[AttributeUsage(AttributeTargets.All, Inherited = true, AllowMultiple = false)] public class SetValForAll : Attribute { public LimitEnum Limit { get; set; } public SetValForAll(LimitEnum limit) { Limit = limit; // 如果业务需要字符串值,后续使用时调用Limit.ToString()即可 } }
使用方式:
[SetValForAll(LimitEnum.max)] public class UsingTheAttributeHere { }
方案2:不修改原有特性定义,使用nameof操作符
如果你不能修改原有SetValForAll特性的定义,可以用C#的nameof关键字,它会在编译期把枚举成员转换成对应的常量字符串,符合特性参数要求:
[SetValForAll(nameof(LimitEnum.max))] public class UsingTheAttributeHere { }
nameof(LimitEnum.max)会在编译时直接替换为常量字符串"max",不需要运行时计算,也不需要硬编码写死字符串。
内容的提问来源于stack exchange,提问作者Abhishek
相关产品推荐
相关产品推荐

