Все, чтобы обеспечить механизм «на лету» для отладки приложения на разных языках, я использую требуемую строку ресурсов (на иностранном языке) для отображения Английский эквивалент во время выполнения, если пользователь этого потребует. Это делается с помощьюКак использовать имя переменной, полученное во время выполнения
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
и использование null
от GetMessage
и используя ??
, как я могу достичь этого [если это вообще возможно]?
Спасибо за ваше время.
Почему вы не просто возвращаете 'messageKey' (исходное значение, а не перезаписываемую версию с возвращаемым значением' GetName') вместо null из 'Utils.GetMessage'? Мне нужно что-то пропустить, поэтому, пожалуйста, просветите меня :) –
Мне пришлось отредактировать вопрос, поскольку я немного опередил себя. Я могу передать экземпляр 'MessageString', как я делал, или отражение возвращает имя локальной переменной в' GetMessage'. У меня теперь есть две проблемы - избегайте лямбда в вызове и не нужно использовать нулевой оператор коалесценции! Спасибо за ваше время. – MoonKnight