VB.NET函数将属性名称作为字符串

Jas*_*son 7 .net vb.net parameters properties function

我正在尝试创建一个函数,当一个属性作为参数传递给它时,它返回用于将属性定义为字符串的名称.例如,

Shared Function PropertyToStr(Propert As Object)
     'Code to get property name and return it as a string goes here  
End Function
Run Code Online (Sandbox Code Playgroud)

提供这First_Name是属性的名称,定义如下:

Property First_Name as String
Run Code Online (Sandbox Code Playgroud)

该功能应该像:

Dim str as String = PropertyToStr(First_Name) ' Resulting in str = "First_Name"
Run Code Online (Sandbox Code Playgroud)

注意我只想在此函数中返回属性名称"First_Name",而不是"MyClass.First_Name".

我找到了我的函数类似代码的其他示例,我需要用c#编写,但我无法复制他们在VB.Net中使用MemberExpression

获取强类型的子属性名称

获取属性的名称作为字符串

从lambda表达式中检索属性名称

Joh*_*ner 11

编辑:在Visual Studio 2015中,您可以使用NameOf运算符来完成此操作:

Property First_Name As String

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    MessageBox.Show(NameOf(First_Name))
End Sub
Run Code Online (Sandbox Code Playgroud)

旧版.net的原始答案:

通过一些代码转换器运行其他答案并清理它会产生以下结果,这似乎工作得很好.

Private Shared Function GetMemberInfo(method As Expression) As MemberExpression
    Dim lambda As LambdaExpression = TryCast(method, LambdaExpression)
    If lambda Is Nothing Then
        Throw New ArgumentNullException("method")
    End If

    Dim memberExpr As MemberExpression = Nothing

    If lambda.Body.NodeType = ExpressionType.Convert Then
        memberExpr = TryCast(DirectCast(lambda.Body, UnaryExpression).Operand, MemberExpression)
    ElseIf lambda.Body.NodeType = ExpressionType.MemberAccess Then
        memberExpr = TryCast(lambda.Body, MemberExpression)
    End If

    If memberExpr Is Nothing Then
        Throw New ArgumentException("method")
    End If

    Return memberExpr
End Function

Public Shared Function GetPropertyName(Of T)(prop As Expression(Of Func(Of T))) As String
    Dim expression = GetMemberInfo(prop)
    Return expression.Member.Name
End Function

Property First_Name As String
Property LastName As String
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    MessageBox.Show(GetPropertyName(Function() First_Name))
    MessageBox.Show(GetPropertyName(Function() LastName))
End Sub
Run Code Online (Sandbox Code Playgroud)