2008-10-27 4 views
25

Ich bin derzeit an einem Projekt arbeiten, wo ein Abschnitt des Codes wie folgt aussieht:dynamisch aufrufen Eigenschaften von string name VB.NET mit

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

Es dauert eine Weile. Der Code ist offensichtlich ausführlich und es fühlt sich wie es könnte verbessert werden. Gibt es eine Möglichkeit, um dynamisch eine Eigenschaft in VB.NET aufrufen, so dass so etwas wie dies geschehen kann:

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

Antwort

15

Andere vollkommen angemessen beantwortet haben, aber Nur für den Fall, dass es sich um einen leistungsabhängigen Code handelt, sollten Sie die reflektierenden Aufrufe in Delegaten zusammenstellen.

Ich habe eine blog entry über MethodBase.Invoke in Delegaten zu verwandeln. Der Code ist in C#, aber die gleiche Technik kann auch auf VB.NET angewendet werden. Um dies mit Eigenschaften zu verwenden, rufen Sie die entsprechende "Setter" -Methode mit PropertyInfo.GetSetMethod ab und erstellen Sie dann einen Delegaten, der das aufruft. Sie könnten eine Zuordnung von Feldname zu "Delegat zum Aufrufen des Feldes" haben.

Um es noch einmal zu wiederholen, dies ist nur wirklich notwendig, wenn es sich um einen performance-kritischen Code handelt. Andernfalls möchten Sie vielleicht immer noch eine Dictionary<string, PropertyInfo> erstellen, um zu vermeiden, dass Sie oft GetProperty aufrufen, aber der Schritt, es in einen Delegaten umzuwandeln, ist wahrscheinlich nicht die Mühe wert.

+3

CallByName sieht einfacher aus. Inwiefern unterscheidet sich dies in Bezug auf die Leistung von Reflection? – EndangeredMassa

+0

Ich glaube, CallByName verwendet Reflection intern, und ich vermute, dass verschiedene VB-spezifische Spielereien aus Gründen der Abwärtskompatibilität angewendet werden. Testen Sie es, aber ich bezweifle sehr, dass Sie es so schnell wie einen Delegierten sehen werden. Ja, die Verwendung von MakeDelegate ist komplizierter, aber weitaus performanter als die Reflexion. –

+0

Ihr Blog-Eintrag ist gebrochen – Fredou

30

Ich kann nicht glauben, dass die anderen Poster Ihnen gesagt haben, Reflexion zu verwenden. VB als CallByName Funktion, die genau das tut, was Sie wollen.

+7

Heiliger Mist, ich wünschte, ich hätte das vor Jahren gewusst. –

6

Yeah ... CallByName

10

Ja, CallByName die beste Lösung für Sie. Hier Anweisung, es zu tun:

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

Sie können „NameExample“ anstelle von „NameExample1“ schreiben.
Erwähnen Sie, dass der dritte Parameter Sie 'Get', 'Let' diesen Parameter (und sogar jede Methode aufrufen).
So können Sie den Wert Ihres Parameters mit CallType.Get abrufen.