Можете ли вы получить имя строки resx, доступ к которой осуществляется через точечную нотацию, используя какое-то отражение?

#.net #vb.net #resx

#.net #vb.net #resx

Вопрос:

У меня есть файлы языковых ресурсов, к которым я обычно получаю доступ, используя точечную нотацию, например:

myStrings.This_is_a_test_string

Однако теперь мне нужно получить две языковые версии одной и той же строки при обработке ошибок. Причина в том, что локальная строка отображается пользователю, в то время как английская строка записывается в файл журнала.

Я могу вызвать приведенную ниже функцию, используя такой оператор, как:

—— начать код ——

 strCustomErrorMsg = GetCustomErrorMsgStrings(MyStrings.ResourceManager.BaseName, "This_is_a_test_string")



Public Function GetCustomErrorMsgStrings(strResource As String, strProperty As String) As String
    Dim rm As ResourceManager
    Dim strLocal As String
    Dim strEnglish As String
    Dim strCustomErrorMsg As String

    rm = New ResourceManager(strResource, Assembly.GetExecutingAssembly())

    strLocal = rm.GetString(strProperty, Thread.CurrentThread.CurrentUICulture)

    SetLanguage("en")

    strEnglish = rm.GetString(strProperty, Thread.CurrentThread.CurrentUICulture)

    SetLanguage(g_strLanguage)

    strCustomErrorMsg = "Local Text: " amp; strLocal amp; "||||" amp; vbNewLine amp; "English: " amp; strEnglish

    GetCustomErrorMsgStrings = strCustomErrorMsg

End Function
 

—— конечный код ——

Проблема в том, что я хочу продолжать использовать строго типизированный класс resx и точечную нотацию, такую как myStrings.This_is_a_test_string поэтому Visual Studio улавливает несуществующие строки ресурсов в режиме реального времени.

Для параметра strProperty могу ли я каким-либо образом сделать что-то вроде передачи myStrings .This_is_a_test_string .getName .toString(), который вернет мне имя «This_is_a_test_string»?

Меня беспокоит то, что я буду делать опечатки при вводе буквальных строк, таких как «This_is_a_test_string» для параметра strProperty, и обслуживание станет более сложным.

Спасибо за помощь.

Мэтью

Комментарии:

1. Лучшим выбором может быть что-то, основанное на механизме выражения. См jagregory.com/writings/introduction-to-static-reflection для некоторого обсуждения того, как сделать это на C #. В VB вам нужно остерегаться того, что компилятор VB иногда преобразует ваш доступ к свойству в унарное преобразование в Object (поэтому вместо вашего выражения Body a MemberExpression , вместо этого это a UnaryExpression , и Operand это MemberExpression то, что вы пытаетесь получить.

2. ПРИВЕТ, Крейг. Статическое отражение выглядит точно так, как мне нужно. Однако, когда я вызываю пример функции в предоставленной вами статье, я получаю эту ошибку: Dim PropInfo Как PropertyInfo = getProperty(DevStrings . This_is_a_test_string) BC36645: Тип (ы) данных параметра (ов) типа в общедоступной функции метода getProperty(из TEntity)(выражение ByVal Как выражение (Из Func(из TEntity, Object))) Поскольку PropertyInfo’ не может быть выведен из этих аргументов. Явное указание типов данных может исправить эту ошибку. Есть идеи о том, как сделать это рабочим кодом?

3. У меня нет никаких применений, где выводится содержащий тип, поэтому я не знаю, возможно ли это. Я думаю, что вывод типа свойства может работать в зависимости от того, как вы все это настроили.

Ответ №1:

Если вас беспокоит только то, что вы будете делать опечатки при вводе буквальной строки, тогда просто используйте NameOf(MyStrings.This_is_a_test_string) .