如何通过仅传递 Resources.MyProperty 属性 来获取 Resources Key 字符串值
How to get Resources Key string value by passing only the Resources.MyProperty property
我有一个标准资源文件,其中自动生成的源代码生成这种类型的行:
/// <summary>
/// Looks up a localized string similar to Database Error.
/// </summary>
internal static string DatabaseError {
get {
return ResourceManager.GetString("DatabaseError", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Invalid Login.
/// </summary>
internal static string InvalidLogin {
get {
return ResourceManager.GetString("InvalidLogin", resourceCulture);
}
}
我有一个循环遍历所有资源文件并获取所有条目的键和值并将它们存储在数据库中的地方。
我有这个是因为翻译将由客户维护,而不需要每次有人想要重命名一个值或仅仅是因为系统提供了一种新语言时都制作一个新版本。
现在,我需要轻松访问这些翻译,我不想使用选项 1,而是选项 2(在这一行中,我使用资源 属性 而不是一个字符串)。
选项 1 // 我不想使用的选项
var txt= translationService.GetTranslation("DatabaseError", UserContext.LanguageId);
选项 2 // 我尝试使用的解决方案种类
var txt= translationService.GetTranslation(Resources.DatabaseError, UserContext.LanguageId);
选项2的"style",允许程序员不关心字符串。字符串很容易 mistakes/bugs 并且通过使用现有的 属性 编译器知道什么时候不再有效。
问题是,通过访问此 属性 我从资源文件中获取 "translated" 值....我只是不想尝试将此文本与现有资源密钥...不仅因为这效率不高,而且不能确保非重复值....
另一种解决方案,但我真的不想使用这个解决方案:制作我自己的 "ResourcesClassMapping class",将 "string" 值保留在那里并进行此映射....我根本不这样做想要跟踪字符串键值,以了解它们是新旧还是更新。
我怎样才能以漂亮优雅的方式做到这一点?
好吧,当我在等待一些反馈和可能的其他 solutions/approaches 时,我找到了一个不错的选择:
public static string GetTranslation(Expression<Func<string>> expr)
{
if (!(expr.Body is MemberExpression member)) return "";
var property = member.Member as PropertyInfo;
if (property == null) return "";
var key = property.Name;
// TODO: using the key name I can get the value from the DB/cache
var finalTranslation = "";
return finalTranslation;
}
//and I call it like this:
var txt = GetTranslation(() => Resources.Resources.InvalidLogin);
我有一个标准资源文件,其中自动生成的源代码生成这种类型的行:
/// <summary>
/// Looks up a localized string similar to Database Error.
/// </summary>
internal static string DatabaseError {
get {
return ResourceManager.GetString("DatabaseError", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Invalid Login.
/// </summary>
internal static string InvalidLogin {
get {
return ResourceManager.GetString("InvalidLogin", resourceCulture);
}
}
我有一个循环遍历所有资源文件并获取所有条目的键和值并将它们存储在数据库中的地方。 我有这个是因为翻译将由客户维护,而不需要每次有人想要重命名一个值或仅仅是因为系统提供了一种新语言时都制作一个新版本。
现在,我需要轻松访问这些翻译,我不想使用选项 1,而是选项 2(在这一行中,我使用资源 属性 而不是一个字符串)。
选项 1 // 我不想使用的选项
var txt= translationService.GetTranslation("DatabaseError", UserContext.LanguageId);
选项 2 // 我尝试使用的解决方案种类
var txt= translationService.GetTranslation(Resources.DatabaseError, UserContext.LanguageId);
选项2的"style",允许程序员不关心字符串。字符串很容易 mistakes/bugs 并且通过使用现有的 属性 编译器知道什么时候不再有效。
问题是,通过访问此 属性 我从资源文件中获取 "translated" 值....我只是不想尝试将此文本与现有资源密钥...不仅因为这效率不高,而且不能确保非重复值....
另一种解决方案,但我真的不想使用这个解决方案:制作我自己的 "ResourcesClassMapping class",将 "string" 值保留在那里并进行此映射....我根本不这样做想要跟踪字符串键值,以了解它们是新旧还是更新。
我怎样才能以漂亮优雅的方式做到这一点?
好吧,当我在等待一些反馈和可能的其他 solutions/approaches 时,我找到了一个不错的选择:
public static string GetTranslation(Expression<Func<string>> expr)
{
if (!(expr.Body is MemberExpression member)) return "";
var property = member.Member as PropertyInfo;
if (property == null) return "";
var key = property.Name;
// TODO: using the key name I can get the value from the DB/cache
var finalTranslation = "";
return finalTranslation;
}
//and I call it like this:
var txt = GetTranslation(() => Resources.Resources.InvalidLogin);