【发布时间】:2015-06-22 01:10:42
【问题描述】:
我不确定我的措辞是否正确,但我想做的是这样。我使用有这样的代码:
Select Case name
Case "ThisProperty": ...
Case "ThatProperty": ...
...
End Select
但name 是对象的属性,我想以类型安全的方式执行此操作,因此如果属性更改,我会将其作为编译时错误捕获。所以我想要这种伪代码
Select Case name
Case PropertyName(Of MyType)(Function(x) x.ThisProperty): ...
Case PropertyName(Of MyType)(Function(x) x.ThatProperty): ...
...
End Select
在哪里
Function PropertyName(Of T)(propertySpecifier As Expression(Of Func(Of T, Object))) As String
Return {expression magic to get property name as a string}
End Function
我的PropertyName 函数工作正常,但你不能像这样编写Select Case,即使你可以,我担心它会非常低效,无论如何,在一个紧密的循环中,因为所有表达式操作。 (而且语法也很乏味。)
所以我想知道是否有一种合理的方式来编写代码来解决这两个(三个)问题。
【问题讨论】:
-
您要处理多少个值?也许尝试一个枚举?
-
这在 VB.NET 14 (VS 2015) 中会容易得多,因为他们正在添加
NameOf运算符。 -
@JacobRoberts:然后我只需要在属性名称更改时手动更新 Enum,这只会将问题转移到其他地方。我正在尝试做的事情是让编译器在我更改某些内容时自动捕获它。
-
@StevenDoggart:哦,太酷了!我想我需要在尝试之前获得那个版本,但它看起来很有希望。
标签: .net vb.net generics lambda clr