我目前正在开发一个项目,其中一部分代码如下所示:
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
Jonathan All.. 31
我不敢相信其他海报告诉你使用反射.VB作为CallByName函数,完全符合您的要求.
我不敢相信其他海报告诉你使用反射.VB作为CallByName函数,完全符合您的要求.
其他人已经完全合理地回答了,但是为了防止这是性能敏感的代码,你可能想要将反射调用编译成代理.
我有一篇关于将MethodBase.Invoke转换为委托的博客文章.代码在C#中,但同样的技术也可以应用于VB.NET.要将其与属性一起使用,请使用PropertyInfo.GetSetMethod获取相应的"setter"方法,然后构建一个调用它的委托.您可以从字段名称到"委托调用以设置字段".
重申一下,如果它只是一个性能关键的代码片段,那么这才是真正必要的.否则,您可能仍希望创建一个Dictionary
以避免GetProperty
多次调用,但将其转换为委托的步骤可能不值得担心.
是的,CallByName是最适合您的解决方案.这是执行此操作的说明:
CallByName(yourClassOrObjectName,"NameExample1",CallType.Set,oReader.ReadString)
您可以编写"NameExample"来代替"NameExample1".
提及,第三个参数允许你'获取','让'那个参数(甚至调用任何方法).
所以你可以使用你的参数值CallType.Get
.