0

总而言之,为了提供一种即时机制来调试不同语言的应用程序,我使用所需的资源字符串(外语)在用户需要时在运行时显示等效的英语。这是使用

public static string GetMessage(string messageKey)
{
    CultureInfo culture = Thread.CurrentThread.CurrentCulture;
    if (!culture.DisplayName.Contains("English"))
    {
        string fileName = "MessageStrings.resx";
        string appDir = Path.GetDirectoryName(Application.ExecutablePath);
        fileName = Path.Combine(appDir, fileName);
        if (File.Exists(fileName))
        {
            // Get the English error message.
            using (ResXResourceReader resxReader = new ResXResourceReader(fileName))
            {
                foreach (DictionaryEntry e in resxReader)
                    if (e.Key.ToString().CompareNoCase(messageKey) == 0)
                        return e.Value.ToString();
            }
        }
    }
    return null;
}

其中GetName定义为

public static string GetName<T>(Expression<Func<T>> expression)
{
    return ((MemberExpression)expression.Body).Member.Name;
}

我通常在我的应用程序中显示本地化消息,例如

Utils.ErrMsg(MessageStrings.SomeMessage);

或者

Utils.ErrMsg(String.Format(MessageStrings.SomeMessage, param1, param2));

现在我可以使用在不同文化中运行的应用程序显示相关的英文消息

Utils.ErrMsg(Utils.GetMessage(
    Utils.GetName(() => MessageStrings.ErrCellAllocStatZeroTotal)) ?? 
        MessageStrings.ErrCellAllocStatZeroTotal);    

我想避免在调用GetName和使用中使用 lambda 表达式nullfromGetMessage和 using ??,我怎样才能实现这一点[如果可能的话]?

谢谢你的时间。

4

1 回答 1

1

我不完全理解您的代码,但如果您只想动态访问对象的属性,请尝试此操作(您必须将 [Object] 和“PropertyName”替换为您的特定值):

// get the property from object
PropertyInfo Property = [Object].GetType().GetProperty("PropertyName");

// get the value
int value = (int)Property.GetValue([Object], null);
于 2013-08-07T15:00:09.693 回答