Метод GetProperty чувствителен к регистру для VB? - PullRequest
5 голосов
/ 17 ноября 2011

Я отлаживал одно из приложений, над которым я работаю, и наткнулся на интересную проблему.Для тех, кто не знаком с 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 # и беспокоиться о корпусе?

1 Ответ

15 голосов
/ 17 ноября 2011

Имена переменных в VB.NET обычно не чувствительны к регистру.

Это трюк, выполненный компилятором. Сам CLR чувствителен к регистру. Поскольку отражение не имеет ничего общего с компилятором, применяется чувствительность к регистру.

Есть ли способ вызвать этот метод "стиль VB.NET" и игнорировать регистр?

Да. Укажите BindingFlags для игнорирования:

Dim propInfo As PropertyInfo = test.GetType().GetProperty(propName, BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.IgnoreCase)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...