您可以使用某种反射获得通过点符号访问的 resx 字符串的名称吗?

Posted

技术标签:

【中文标题】您可以使用某种反射获得通过点符号访问的 resx 字符串的名称吗?【英文标题】:Can you get the name of a resx string accessed through dot notation using some sort of reflection? 【发布时间】:2022-01-08 16:26:39 【问题描述】:

我有语言资源文件,我通常使用点符号访问这些文件,如下所示:

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: " & strLocal & "||||" & vbNewLine & "English: " & 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”反映给我?

我担心在为 strProperty 参数输入诸如“This_is_a_test_string”之类的文字字符串时会出现拼写错误,并且维护会变得更加困难。

感谢您的帮助。

马修

【问题讨论】:

你最好的选择可能是基于表达机制的东西。有关在 C# 中执行此操作的一些讨论,请参阅 jagregory.com/writings/introduction-to-static-reflection。在 VB 中,您需要注意的是,VB 编译器有时会将您的属性访问封装为一元转换为Object(因此,您的表达式Body 不是MemberExpression,而是@ 987654326@ 和它的Operand 是你想要得到的MemberExpression 嗨,克雷格。静态反射看起来和我需要的完全一样。但是,当我在您提供的文章中调用示例函数时,出现此错误: Dim PropInfo As PropertyInfo = GetProperty(DevStrings.This_is_a_test_string) BC36645: Data type(s) of the type parameter(s) in method 'Public Function GetProperty( Of TEntity)(ByVal expression As Expression(Of Func(Of TEntity, Object))) As PropertyInfo' 不能从这些参数中推断出来。明确指定数据类型可能会更正此错误。关于如何让它成为工作代码的任何想法? 我没有任何推断包含类型的用途,所以我不知道这是可能的。我认为属性类型推断可能会起作用,这取决于你如何设置整个事情。 【参考方案1】:

如果您唯一担心的是在输入文字字符串时会出现拼写错误,那么只需使用NameOf(MyStrings.This_is_a_test_string)

【讨论】:

以上是关于您可以使用某种反射获得通过点符号访问的 resx 字符串的名称吗?的主要内容,如果未能解决你的问题,请参考以下文章

资源(resx)自定义助手

可以使用反射获得类中的瞬态字段吗

如何继承资源文件(resx)

如果您可以通过反射访问它们,那么拥有私有构造函数有啥意义?

您可以使用 Visual Web Developer 编辑 resx 文件吗?

java反射机制