当前位置:  开发笔记 > 编程语言 > 正文

使用VB.NET通过字符串名称动态调用属性

如何解决《使用VB.NET通过字符串名称动态调用属性》经验,为你挑选了3个好方法。

我目前正在开发一个项目,其中一部分代码如下所示:

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函数,完全符合您的要求.



1> Jonathan All..:

我不敢相信其他海报告诉你使用反射.VB作为CallByName函数,完全符合您的要求.


神圣的废话,我希望我多年前知道.

2> Jon Skeet..:

其他人已经完全合理地回答了,但是为了防止这是性能敏感的代码,你可能想要将反射调用编译成代理.

我有一篇关于将MethodBase.Invoke转换为委托的博客文章.代码在C#中,但同样的技术也可以应用于VB.NET.要将其与属性一起使用,请使用PropertyInfo.GetSetMethod获取相应的"setter"方法,然后构建一个调用它的委托.您可以从字段名称到"委托调用以设置字段".

重申一下,如果它只是一个性能关键的代码片段,那么这才是真正必要的.否则,您可能仍希望创建一个Dictionary以避免GetProperty多次调用,但将其转换为委托的步骤可能不值得担心.


CallByName看起来更简单.在性能方面,这与Reflection有何不同?

3> Jet..:

是的,CallByName是最适合您的解决方案.这是执行此操作的说明:

CallByName(yourClassOrObjectName,"NameExample1",CallType.Set,oReader.ReadString)

您可以编写"NameExample"来代替"NameExample1".
提及,第三个参数允许你'获取','让'那个参数(甚至调用任何方法).
所以你可以使用你的参数值CallType.Get.

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有