我目前正在开发一个项目,其中代码的一部分如下所示:
Select Case oReader.Name
Case "NameExample1"
Me.Elements.NameExample1.Value = oReader.ReadString
....
Case "NameExampleN"
Me.Elements.NameExampleN.Value = oReader.ReadString
....
End Select
它会持续一段时间。代码显然很冗长,感觉就像它可以改进一样。有没有办法在VB.NET中动态调用属性,这样可以做到这样的事情:
Dim sReadString As String = oReader.ReadString
Me.Elements.InvokeProperty(sReadString).Value = sReadString
答案 0 :(得分:31)
我无法相信其他海报告诉你使用反射。 VB作为CallByName函数,完全符合您的要求。
答案 1 :(得分:16)
其他人已经完全合理地回答了,但是如果这是对性能敏感的代码片段,您可能希望将反射调用编译成代理。
我有blog entry关于将MethodBase.Invoke转为代表的问题。代码在C#中,但同样的技术也可以应用于VB.NET。要在属性中使用它,请使用PropertyInfo.GetSetMethod获取相应的“setter”方法,然后构建一个调用它的委托。您可以从字段名称到“委托调用以设置字段”。
重申一下,如果它只是一个性能关键的代码,那么这才是真正必要的。否则,您可能仍希望创建Dictionary<string, PropertyInfo>
以避免多次调用GetProperty
,但将其转换为委托的步骤可能不值得担心。
答案 2 :(得分:11)
是的,CallByName是最适合您的解决方案。这是指令:
CallByName(yourClassOrObjectName,"NameExample1",CallType.Set,oReader.ReadString)
您可以使用“NameExample”代替“NameExample1”
提一下,第三个参数允许你'获取','让'那个参数(甚至调用任何方法)
因此,您可以使用CallType.Get
获取参数的值。