C#字符串资源值为枚举字符串部分值?

时间:2010-06-04 10:00:33

标签: c# resources enums

使用VS2010和.net V4.0我想实现以下目标:

我的项目中已经有2个语言的2个资源文件 - 英语和捷克语。

我必须说.net中的资源管理非常好,我甚至为了在实现String时获得代码而感到惊讶:

string desc = Strings.ResourceManagerDesc

这将获取与线程的当前文化相关联的字符串。

现在我正在尝试创建一个Enum,它可以从字符串资源中解释出Enum的String部分。按以下方式(此代码不起作用):

public enum DownloadStatus
{
 1 = Strings.DownloadState_Complete,
 2 = Strings.DownloadState_Failed,
 3 = Strings.DownloadState_InProgress
}

这是一个组成的例子,但你可以在这里看到这一点。由于上面的代码不起作用,是否有最佳实践方法来实现我想要的目标?

5 个答案:

答案 0 :(得分:9)

这个问题很陈旧,但没有接受答案,我一直在寻找一个好办法。

这就是我所做的,我为我的Enum构建了一个扩展,以便它从资源管理器中返回一个值:

public enum EventType
    {
        NewVersion = 1,
        Accepted = 2,
        Rejected = 3,
        BruteForce = 4
    }

    public static class EventTypeExtension
    {
        public static string Display(this EventType type)
        {
            return Strings.ResourceManager.GetString("EventType_" + type);
        }
    }

我希望这可以帮助别人!

答案 1 :(得分:1)

枚举是作为程序集的一部分编译的。你实际上是在为枚举值赋值方法不是一个常量值 - CLR不够智能,无法在编译时计算出值,它需要是一个常量。

我建议您为每种语言创建一个不同的枚举(忘记资源),并根据所需的语言上下文使用辅助类返回正确的语句。

答案 2 :(得分:1)

枚举不能从字符串继承。在代码中,您不需要关心代码的语言,因此您的枚举可以简单地包含相关的状态。

看起来你需要的是一个实用工具方法,用于将枚举值转换为相关的字符串表示 - 只需为此创建一个方法。

编辑:当你使用枚举来打开案例,但每个枚举值需要更多信息时,我倾向于删除枚举并创建一系列静态引用并在检查中使用它们。此引用可以是包含枚举值的类,然后可以公开有用的标题或描述。

答案 3 :(得分:1)

您可以通过字符串获取资源,因为您可以将枚举转换为字符串,这非常简单。

enum Whatever { Ready, Set, Go }

public static string GetEnumerationString(Enum enumeration)
{
    string resourceName = 
        string.Concat(enumeration.GetType().Name, "_", enumeration);
    return ResourceManager.GetString(resourceName);
}

现在,在此实现中,我们为所有枚举资源添加了枚举名称的前缀。在我们做的项目中,它只是防止与其他资源的冲突并使它们易于查找。然后,您必须确保添加名为Whatever_Ready,Whatever_Set和Whatever_Go的资源。

同样地,如果您要查看最初编写的静态成员字符串的生成代码,您可能会看到:

public static string DownloadStatus_Complete
{
    return ResourceManager.GetString("DownloadStatus_Complete", Resource.Culture);
}

答案 4 :(得分:1)

IMO,Enum值应反映到域中,不应特定于UI(语言上下文)。

您可能想要这样做

public enum DownloadStatus
{
    Complete = 1,
    Failed = 2,
    InProgress = 3
}

并使用一些EnumHelper方法在UI层中获取特定于文化的描述

var downloadStatusString = EnumHelper.GetDescription<DownloadStatus>(DownloadStatus.Complete);

和EnumHelper类将从资源文件

中读取特定于文化的字符串
public static class EnumHelper
{
    public static string GetDescription<T>(T value)
        where T : struct
    {
        if (!typeof(T).IsEnum)
        {
            throw new ArgumentException("value must be Enum.", "value");
        }

        var name = value.ToString();

        string resourceKey = string.Format(CultureInfo.InvariantCulture, "{0}_{1}", typeof(T).FullName, name);

        object resource = HttpContext.GetGlobalResourceObject("EnumDescriptions", resourceKey, Thread.CurrentThread.CurrentUICulture);
        string description = resource as string ?? name;
        return description;
    }
}

注意:资源文件名为 EnumDescriptions ,密钥必须为此转化YourNamespace.EnumType_EnumValueInString。 (我正在使用HttpContext获取资源值,如果您不使用ASP.Net,可能需要更改它。