【发布时间】:2019-05-28 15:53:24
【问题描述】:
我无法弄清楚如何提出这个问题(标题措辞不好),所以让我从一个使用 NameOf() 方法的示例开始,因为它的作用类似于我试图做的事情完成。
如果我有这样的课程:
Public Class MyClass
Public Property Foo As Bar
End Class
然后我声明它的一个实例Dim instance As New MyClass,然后我可以通过以下两种方式之一使用NameOf() 方法:
' Both of these lines will print "Foo"
Console.WriteLine(NameOf(instance.Foo))
Console.WriteLine(NameOf(MyClass.Foo))
我想实现一个可以接受类似类型参数的方法,但我不知道如何做。 这是我写的(扩展)方法:
<Extension()>
Public Function GetPathOfProperty(Of T As Class, TProp)(myObj As T, prop As Expression(Of Func(Of TProp))) As String
Dim result As String = String.Empty
Dim foundName As String = String.Empty
Dim className As String = myObj.GetType().Name
Dim p As MemberExpression = TryCast(prop.Body, MemberExpression)
While p IsNot Nothing
If className = p.Member.DeclaringType.Name Then
foundName = className + "."
End If
result = foundName + p.Member.Name + "." + result
If Not String.IsNullOrEmpty(foundName) Then
Exit While
End If
p = TryCast(p.Expression, MemberExpression)
End While
Return IIf(String.IsNullOrEmpty(foundName), "", result.Substring(0, result.Length - 1))
End Function
使用我上面的例子,我可以这样使用它:
' Prints "MyClass.Foo"
Console.WriteLine(instance.GetPathOfProperty(Function() instance.Foo))
' Prints "MyClass.Foo.SomeBarProperty"
Console.WriteLine(instance.GetPathOfProperty(Function() instance.Foo.SomeBarProperty))
我想创建此方法的另一个版本,它不是扩展方法,而是可以像(或类似于)这样调用的静态方法:
Console.WriteLine(GetPathOfProperty(Function() MyClass.Foo) ' Prints "MyClass.Foo"
这样我就可以使用该函数,而无需首先实际创建MyClass 的实例。这就是我需要帮助的地方。由于MyClass 不是静态类,我无法将MyClass.Foo 放入函数调用中。我的第一个想法是使用反射,但我不知道如何。是否有我可以使用的参数类型来允许我执行此操作(如果有,看起来如何)?还是这只是白日梦而不可能?
【问题讨论】:
-
"T As Class" 类不是类型;它是一个关键字。可能是 T 类型
-
您不能引用类型名称后跟属性 - 这不是有效的语法。所以在 VB 或 C# 中没有办法做到这一点。
标签: vb.net linq reflection .net-4.7.2