views:

4148

answers:

6

I'm currently working on a project where a section of the code looks like this:

Select Case oReader.Name
    Case "NameExample1"
        Me.Elements.NameExample1.Value = oReader.ReadString
    ....
    Case "NameExampleN"
        Me.Elements.NameExampleN.Value = oReader.ReadString
    ....
End Select

It continues on for a while. The code is obviously verbose and it feels like it could be improved. Is there any way to dynamically invoke a property in VB.NET such that something like this can be done:

Dim sReadString As String = oReader.ReadString
Me.Elements.InvokeProperty(sReadString).Value = sReadString
+10  A: 

You can use System.Reflection for this:

Me.GetType().GetProperty(oReader.Name).SetValue(Me, oReader.ReadString, nothing)
Jon B
+4  A: 

Others have answered perfectly reasonably, but just in case this is a performance-sensitive piece of code, you might want to compile the reflective calls into delegates.

I've got a blog entry about turning MethodBase.Invoke into delegates. The code is in C#, but the same technique can be applied to VB.NET as well. To use this with properties, get the appropriate "setter" method with PropertyInfo.GetSetMethod and then build a delegate which invokes that. You could have a map from field name to "delegate to call to set the field".

Just to reiterate, this is only really necessary if it's in a performance-critical piece of code. Otherwise, you might still want to create a Dictionary<string, PropertyInfo> to avoid calling GetProperty many times, but the step to convert it into a delegate probably isn't worth worrying about.

Jon Skeet
CallByName looks simpler. How does this differ from Reflection in terms of performance?
EndangeredMassa
I believe CallByName uses Reflection internally, and I suspect applies various VB-specific shenanigans for backward compatibility. Test it, but I very much doubt that you'll see it being as fast as a delegate. Yes, using MakeDelegate is more complicated, but vastly more performant than reflection.
Jon Skeet
+2  A: 

I can't believe the other posters told you to use reflection. VB as a CallByName function that does exactly what you want.

Jonathan Allen
+2  A: 

Yeah... CallByName

A: 

Hi Jonathan Allen,

Thanx for your answer but there is no Interaction.CallByName in Silverlight

Arvin Meralpis