GetProperty方法对VB区分大小写?

时间:2011-11-17 18:47:42

标签: vb.net reflection case-sensitive

我正在调试我正在处理的一个应用程序,并遇到了一个有趣的问题。对于那些不熟悉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#心态并担心套管?

1 个答案:

答案 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)