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();
}