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

时间:2008-10-27 17:54:39

标签: 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

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

Dim sReadString As String = oReader.ReadString
Me.Elements.InvokeProperty(sReadString).Value = sReadString

3 个答案:

答案 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获取参数的值。