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

Tom*_*Tom 26 vb.net reflection invoke

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

Select Case oReader.Name
    Case "NameExample1"
        Me.Elements.NameExample1.Value = oReader.ReadString
    ....
    Case "NameExampleN"
        Me.Elements.NameExampleN.Value = oReader.ReadString
    ....
End Select
Run Code Online (Sandbox Code Playgroud)

它会持续一段时间.代码显然很冗长,感觉可以改进.有没有办法动态调用VB.NET中的属性,这样就可以完成这样的事情:

Dim sReadString As String = oReader.ReadString
Me.Elements.InvokeProperty(sReadString).Value = sReadString
Run Code Online (Sandbox Code Playgroud)

Jon*_*len 31

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

  • 神圣的废话,我希望我多年前知道. (8认同)

Jon*_*eet 16

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

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

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

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

Jet*_*Jet 11

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

CallByName(yourClassOrObjectName,"NameExample1",CallType.Set,oReader.ReadString)
Run Code Online (Sandbox Code Playgroud)

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