C# 在C中使用自定义属性向枚举添加头信息#
我可以创建和构建自己的属性,并从枚举中使用它们,但我无法将这些属性用作枚举的头信息C# 在C中使用自定义属性向枚举添加头信息#,c#,enums,attributes,C#,Enums,Attributes,我可以创建和构建自己的属性,并从枚举中使用它们,但我无法将这些属性用作枚举的头信息 例如,考虑下面的枚举: [EnumSize(0x30000)] public enum Memories { [MemSize(0x10000)] [Description("Memory0")] Memory0Base = 0x00000, [MemSize(0x10000)] [Description(
例如,考虑下面的枚举:
[EnumSize(0x30000)]
public enum Memories
{
[MemSize(0x10000)]
[Description("Memory0")]
Memory0Base = 0x00000,
[MemSize(0x10000)]
[Description("Memory1")]
Memory1Base= 0x10000,
[MemSize(0x10000)]
[Description("Memory2")]
Memory2Base= 0x20000
}
现在,我以以下方式创建了EnumSize和MemSize属性:
public class EnumSizeAttribute : System.Attribute
{
private int _value;
public EnumSizeAttribute(int value)
{
_value = value;
}
public int Value
{
get { return _value; }
}
}
并使其更“易于访问”(这意味着我可以执行以下操作:Memories.Memory2Base.MemSize()或Memories.EnumSize()):
非常感谢您提供有关如何使其工作的任何提示。
Memories
是一种类型而不是字段,因此您需要执行以下操作:
public static string EnumSize<T>() where T : struct, Enum
{
EnumSizeAttribute attribute = typeof(T).GetCustomAttribute<EnumSizeAttribute>();
return attribute?.Value.ToString();
}
但这将可用于所有类型,而不仅仅是枚举,这可能不是您想要的
当然,如果异常使用不正确,您可能会抛出异常:
public static string EnumSize(this Type type)
{
if (!type.IsEnum)
{
throw new InvalidOperationException("EnumSize only applies to enums");
}
EnumSizeAttribute attribute = type.GetCustomAttribute<EnumSizeAttribute>();
return attribute?.Value.ToString();
}
公共静态字符串EnumSize(此类型)
{
如果(!type.IsEnum)
{
抛出新的InvalidOperationException(“EnumSize仅适用于枚举”);
}
EnumSizeAttribute属性=type.GetCustomAttribute();
返回属性?.Value.ToString();
}
但我可能会坚持第一个示例。
内存是一种类型而不是字段,因此您需要执行以下操作:
public static string EnumSize<T>() where T : struct, Enum
{
EnumSizeAttribute attribute = typeof(T).GetCustomAttribute<EnumSizeAttribute>();
return attribute?.Value.ToString();
}
但这将可用于所有类型,而不仅仅是枚举,这可能不是您想要的
当然,如果异常使用不正确,您可能会抛出异常:
public static string EnumSize(this Type type)
{
if (!type.IsEnum)
{
throw new InvalidOperationException("EnumSize only applies to enums");
}
EnumSizeAttribute attribute = type.GetCustomAttribute<EnumSizeAttribute>();
return attribute?.Value.ToString();
}
公共静态字符串EnumSize(此类型)
{
如果(!type.IsEnum)
{
抛出新的InvalidOperationException(“EnumSize仅适用于枚举”);
}
EnumSizeAttribute属性=type.GetCustomAttribute();
返回属性?.Value.ToString();
}
但我可能会坚持第一个示例。您需要获取内存类型的属性,而不是其任何一个成员的属性。在这种情况下,您是如何声明EnumSize
扩展方法的?这是非常相关的。你得到了什么错误?你是如何为你的属性声明AttributeUsage
的?@canton7,我以完全相同的方式声明了MemSize和EnumSize,这听起来显然是错误的:-)的确MemSize
也完全不相关——只需关注EnumSize
@JohnathanBarclay给出了一个很好的答案,请注意,您需要获取内存类型
上的属性,而不是它的任何一个成员上的属性。在这种情况下,您是如何声明EnumSize
扩展方法的?这是非常相关的。你得到了什么错误?你是如何为你的属性声明AttributeUsage
的?@canton7,我以完全相同的方式声明了MemSize和EnumSize,这听起来显然是错误的:-)的确MemSize
也完全不相关——只需关注EnumSize
@JohnathanBarclay发布了一个很好的答案,谢谢,我喜欢你的建议,我会试试看!谢谢,我喜欢你的建议,我会试试看!
public static string EnumSize(this Type type)
{
EnumSizeAttribute attribute = type.GetCustomAttribute<EnumSizeAttribute>();
return attribute?.Value.ToString();
}
string size = Memories.EnumSize();
public static string EnumSize(this Type type)
{
if (!type.IsEnum)
{
throw new InvalidOperationException("EnumSize only applies to enums");
}
EnumSizeAttribute attribute = type.GetCustomAttribute<EnumSizeAttribute>();
return attribute?.Value.ToString();
}