2013-08-07 3 views
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 и использование null от GetMessage и используя ??, как я могу достичь этого [если это вообще возможно]?

Спасибо за ваше время.

+0

Почему вы не просто возвращаете 'messageKey' (исходное значение, а не перезаписываемую версию с возвращаемым значением' GetName') вместо null из 'Utils.GetMessage'? Мне нужно что-то пропустить, поэтому, пожалуйста, просветите меня :) –

+0

Мне пришлось отредактировать вопрос, поскольку я немного опередил себя. Я могу передать экземпляр 'MessageString', как я делал, или отражение возвращает имя локальной переменной в' GetMessage'. У меня теперь есть две проблемы - избегайте лямбда в вызове и не нужно использовать нулевой оператор коалесценции! Спасибо за ваше время. – MoonKnight

ответ

1

Я не полностью понимаю ваш код, но если вы просто хотите получить доступ к свойствам объекта динамически, попробуйте это (вы должны заменить [Объект] и «ИмениСвойства» с вашими конкретными значениями):

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

// get the value 
int value = (int)Property.GetValue([Object], null);