Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dynamically invoke properties by string name using VB.NET

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
like image 870
Tom Avatar asked Oct 27 '08 17:10

Tom


3 Answers

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

like image 133
Jonathan Allen Avatar answered Oct 12 '22 05:10

Jonathan Allen


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.

like image 21
Jon Skeet Avatar answered Oct 12 '22 05:10

Jon Skeet


Yes, CallByName is the best solution for you. Here's instruction of doing it:

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

You can write "NameExample" in place of "NameExample1".
Mention, that third parameter lets you 'Get', 'Let' that parameter (and even invoke any method).
So you can get your parameter's value using CallType.Get.

like image 11
Jet Avatar answered Oct 12 '22 05:10

Jet