您可以使用某种反射获得通过点符号访问的 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 字符串的名称吗?的主要内容,如果未能解决你的问题,请参考以下文章