2008-10-27 16 views
25

Obecnie pracuję nad projektem, gdzie sekcja kodu wygląda następująco:Dynamicznie wywołać właściwości według nazwy strun za pomocą VB.NET

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

Kontynuuje na chwilę. Kod jest oczywiście pełen gadżetów i wygląda na to, że można go poprawić. Czy jest jakiś sposób aby dynamicznie wywołać właściwość w VB.NET tak, że coś takiego można zrobić:

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

Odpowiedz

15

Inni odpowiedział doskonale uzasadniony, ale na wypadek, gdyby był to fragment kodu wrażliwy na wydajność, możesz chcieć skompilować odblaskowe połączenia w delegatów.

Mam blog entry o przekształceniu MethodBase.Invoke w delegatów. Kod jest w języku C#, ale tę samą technikę można zastosować również w VB.NET. Aby użyć tego z właściwościami, uzyskaj odpowiednią metodę "setter" z PropertyInfo.GetSetMethod, a następnie zbuduj delegata, który to wywoła. Możesz mieć mapę z nazwy pola, aby "delegować do połączenia, aby ustawić pole".

Trzeba tylko powtórzyć, że jest to naprawdę konieczne tylko wtedy, gdy jest to fragment o kluczowym znaczeniu dla wydajności. W przeciwnym razie możesz nadal chcieć utworzyć Dictionary<string, PropertyInfo>, aby uniknąć wielokrotnego wywoływania GetProperty, ale krok, by przekonwertować go na delegata, nie jest warty martwienia się.

+3

CallByName wygląda prościej. Czym się różni od Reflection pod względem wydajności? – EndangeredMassa

+0

Wierzę, że CallByName używa Reflection wewnętrznie, i podejrzewam, że stosuje różne shenanigany specyficzne dla VB ze względu na kompatybilność wsteczną. Przetestuj to, ale bardzo wątpię, że zobaczysz, że jest tak szybki jak delegat. Tak, użycie MakeDelegate jest bardziej skomplikowane, ale znacznie bardziej wydajne niż odbicie. –

+0

Twój link do wpisu w blogu jest zepsuty – Fredou

30

Nie mogę uwierzyć, że inne plakaty kazały ci używać refleksji. VB jako funkcja CallByName, która robi dokładnie to, co chcesz.

+7

Holy crap, chciałbym wiedzieć o tym lata temu. –

6

Taa ... CallByName

10

Tak, CallByName jest najlepszym rozwiązaniem dla Ciebie. Oto instrukcja wykonania tego:

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

Możesz napisać "NameExample" zamiast "NameExample1".
Należy wspomnieć, że trzeci parametr pozwala "Get", "Pozwól" na ten parametr (a nawet wywołaj dowolną metodę).
Możesz więc uzyskać wartość parametru za pomocą CallType.Get.

Powiązane problemy