使用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
}
这是一个组成的例子,但你可以在这里看到这一点。由于上面的代码不起作用,是否有最佳实践方法来实现我想要的目标?
答案 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,可能需要更改它。)