Я отлаживал одно из приложений, над которым я работаю, и наткнулся на интересную проблему.Для тех, кто не знаком с 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 ничего не возвращает, поэтому 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 обычно бываютнечувствительны.Метод GetProperty для Type кажется чувствительным к регистру, когда дело доходит до имени свойства.Есть ли способ вызвать этот метод "стиль VB.NET" и игнорировать регистр?Или я здесь SOL и мне нужно применить менталитет C # и беспокоиться о корпусе?