具有属性vs class的枚举,其属性为

时间:2015-09-06 15:38:37

标签: c# enums

我正在处理一个应用程序,我想知道我应该使用EnumStringValueAttribute对比class的属性。

我的第一个方法是EnumStringValueAttribute。这是我现在使用的方法。通过一种名为GetStringValue()的方法,我能够获得资源价值。

public enum Icon
{
    /// <summary>
    /// The NoruBox contains a symbol consisting of a cardboard box.
    /// </summary>
    [StringValue("/Noru;Component/NoruBox/Media/Box_512.png")]
    Box = 0,

    /// <summary>
    /// The NoruBox contains a symbol consisting of a bust.
    /// </summary>
    [StringValue("/Noru;Component/NoruBox/Media/Person_512.png")]
    Person = 1,

    // More values (total of 5).
}

替代方法是class,其属性类型为Icon(具有名称资源属性。还可以选择添加GetAll()方法,该方法返回包含所有可用图标的列表。

public static class Icons
{
    public static List<Icon> GetAll()
    {
        return new List<Icon> { Box, Person, ... };
    }

    public static Icon Box = new Continent("Box", Localizer.GetString("/Noru;Component/NoruBox/Media/Box_512.png"));
    public static Icon Person = new Continent("Person", Localizer.GetString("/Noru;Component/NoruBox/Media/Person_512.png"));
    // More Icons (total of 5).
}

两者中哪一个是最好的方法,为什么?现在,(虽然我使用的是Enums),类方法看起来比使用Enum要干净得多。使用Enum,我必须在类中输入_icon.GetStringValue() vs _icon.Resource

EDIT1:稍微澄清一下:Icon可以与MessageBox中的一个进行比较,除非在我的项目中有额外的资源参考。

2 个答案:

答案 0 :(得分:4)

另一种方法是对要与枚举中的项关联的每个附加属性使用带扩展方法的枚举。请考虑以下事项:

public static class IconInfo
{
    public static string FileName(this Icon icon)
    {
        switch (icon)
        {
            case Icon.Box: return "/Noru;Component/NoruBox/Media/Box_512.png";
            case Icon.Person: return "/Noru;Component/NoruBox/Media/Person_512.png";
            default: return "";
        }
    }
}

public enum Icon
{
    Box = 0,
    Person = 1,
}

然后,您可以迭代“全部”值,类似于以下内容:

        foreach (Icon icon in Enum.GetValues(typeof(Icon)))
        {
            Console.WriteLine(string.Format("{0}:{1}", icon, icon.FileName()));
        }

如果将无效值传递给您的某个扩展方法,则需要决定是返回默认值还是抛出异常。

答案 1 :(得分:1)

1-考虑使用属性会降低性能,因为您需要反映Enum值以获取字符串值(这将花费) 如果性能在您的应用程序中很重要,您可以使用类方式。

2-另一方面,使用该类可以给你更多的灵活性,可能在以后你会添加someThing到Icon(例如它的大小) 在这一点上也是阶级胜利。

3-我认为使用类会使代码在使用Enum时更加干净和可读。

4-从(设计的角度来看)Icon可以被视为一个类(根据您的应用程序的规范)。如果您在应用程序中专注于Icon,那么使用class可能会更好。