我正在调试我正在处理的一个应用程序,并遇到了一个有趣的问题。对于那些不熟悉VB.NET的人来说,变量名不区分大小写。因此,
Dim foo As Integer
FOO = 5
System.Console.WriteLine(foO)
将编译并输出值5。
无论如何,我正在处理的代码试图通过反射从属性中获取值,如下所示:
Dim value As Object = theObject.GetType().GetProperty("foo", BindingFlags.Public Or BindingFlags.Instance).GetValue(theObject, Nothing)
代码在这一行上抛出了NullReferenceException。在做了一些调试后,我注意到GetProperty方法返回Nothing,所以GetValue是轰炸。查看对象的类,它有一个名为“Foo”的公共属性,而不是“foo”(注意大小写的差异)。显然,由于我在寻找小写的foo,它无法通过反射找到属性。
认为这是一些奇怪的侥幸,我创建了一个快速而肮脏的沙盒应用程序来测试这个发现:
Option Strict On
Option Explicit On
Imports System.Reflection
Module Module1
Sub Main()
Dim test As New TestClass
Dim propNames As New List(Of String)(New String() {"testprop", "testProp", "Testprop", "TestProp"})
'Sanity Check
System.Console.WriteLine(test.testprop)
System.Console.WriteLine(test.testProp)
System.Console.WriteLine(test.Testprop)
System.Console.WriteLine(test.TestProp)
For Each propName As String In propNames
Dim propInfo As PropertyInfo = test.GetType().GetProperty(propName, BindingFlags.Public Or BindingFlags.Instance)
If propInfo Is Nothing Then
System.Console.WriteLine("Uh oh! We don't have PropertyInfo for {0}", propName)
Else
System.Console.WriteLine("Alright, we have PropertyInfo for {0} and its value is: {1}", propName, propInfo.GetValue(test, Nothing))
End If
Next
End Sub
Public Class TestClass
Private _testProp As String = "I got it!"
Public Property TestProp() As String
Get
Return _testProp
End Get
Set(ByVal value As String)
_testProp = value
End Set
End Property
End Class
End Module
令我惊讶的是,输出结果如下:
I got it! I got it! I got it! I got it! Uh oh! We don't have PropertyInfo for testprop Uh oh! We don't have PropertyInfo for testProp Uh oh! We don't have PropertyInfo for Testprop Alright, we have PropertyInfo for TestProp and its value is: I got it!
TL; DR
VB.NET中的变量名通常不区分大小写。对于属性名称,Type上的GetProperty方法似乎区分大小写。有没有办法调用这个方法“VB.NET样式”并忽略大小写?或者我是SOL在这里需要应用C#心态并担心套管?
答案 0 :(得分:15)
VB.NET中的变量名通常不区分大小写。
这是编译器完成的一个技巧。 CLR本身区分大小写。由于反射与编译器无关,因此区分大小写。
有没有办法调用此方法“VB.NET样式”并忽略大小写?
是。在BindingFlags中指定IgnoreCase:
Dim propInfo As PropertyInfo = test.GetType().GetProperty(propName, BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.IgnoreCase)