25

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

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
4

3 回答 3

32

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

于 2008-10-30T06:04:28.153 回答
16

其他人的回答非常合理,但如果这是一段对性能敏感的代码,您可能希望将反射调用编译为委托。

我有一篇关于将MethodBase.Invoke转换为委托的博客文章。代码是用 C# 编写的,但同样的技术也可以应用于 VB.NET。要将其与属性一起使用,请使用 PropertyInfo.GetSetMethod 获取适当的“setter”方法,然后构建一个调用该方法的委托。您可以将字段名称映射到“委托调用以设置字段”。

重申一下,只有在对性能至关重要的代码中才真正有必要这样做。否则,您可能仍想创建一个Dictionary<string, PropertyInfo>以避免GetProperty多次调用,但将其转换为委托的步骤可能不值得担心。

于 2008-10-27T19:33:14.387 回答
11

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

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

您可以写“NameExample”代替“NameExample1”。
提到,第三个参数让你'Get','Let'那个参数(甚至调用任何方法)。
因此,您可以使用CallType.Get.

于 2013-03-24T18:42:03.630 回答