如何在不需要实例化该类型的对象的情况下获取类型的属性名称?

时间:2012-05-15 18:39:10

标签: vb.net reflection types properties

我有一个要求,我需要一种“类型安全”的方式来访问属性名称,而不实际实例化一个对象来获取属性。举一个例子,考虑一个方法,它将IMyObject列表作为参数,并使用表示属性名称的字符串(IMyObject中存在的属性)。

方法实现将获取列表并使用传递的属性名称访问列表中的所有对象...由于某种原因,我们不会纠缠于此!!

现在,我知道您可以使用实例化对象来执行此操作,例如......

Dim x as MyObject = nothing
Dim prop As PropertyInfo = PropHelper.GetProperty(Of MyObject)(Function() x.MyProperty)

我的帮助方法使用反射来将属性的名称作为字符串 - 在网上有很多这样的例子!

但我不想创建这个毫无意义的对象,我只想做像MyObject.MyProperty这样的事情! Reflection允许您在不声明该类型的对象的情况下迭代类型属性和方法......但我想访问特定属性并检索其名称的字符串版本而不进行迭代,并且不声明该类型的对象!

这里的要点是虽然我试图将属性名称作为字符串...这是在运行时完成的...在编译时,我希望这是类型安全的,所以如果有人更改属性名称,编译将中断。

任何人都可以帮忙完成此任务!?!

3 个答案:

答案 0 :(得分:5)

所以这是一个快速的代码清单,用于演示我正在寻找的答案:

Imports System.Linq.Expressions

Public Class A
    Public Prop1 As String
    Public Prop2 As Integer
End Class

Public Class Form1
    Public Function GetPropertyNameB(Of TModel, TProperty)(ByVal [property] As Expression(Of Func(Of TModel, TProperty))) As String
        Dim memberExpression As MemberExpression = DirectCast([property].Body, MemberExpression)
        Return memberExpression.Member.Name
    End Function

    Public Sub New()
        InitializeComponent()
        Dim propertyName As String = GetPropertyNameB(Function(myObj As A) myObj.Prop1)
        Dim propertyName2 As String = GetPropertyNameB(Function(myObj As A) myObj.Prop2)
        MsgBox(propertyName & " | " & propertyName2)
        End
    End Sub
End Class

答案 1 :(得分:0)

您可以将属性作为简单的lamdba表达式传递,并将其作为表达式树在方法中使用。您应该能够分析表达式树以获取属性的字符串名称,但是如果属性名称更改,则lambda表达式将无法编译。查看此页面了解更多详情:

http://msdn.microsoft.com/en-us/library/bb397951.aspx

答案 2 :(得分:0)

您可以使用NameOf函数:

Dim fieldName = nameOf(MyClass.MyField)