Forum: PC-Programmierung Vb.Net - Reflektion, Member in Daten "Boxen"


von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo .Net Experten...
ich möchte einen Typ und dessen Member Speichern bzw. wieder Laden 
können. Dazu habe ich ein Datenmodell gebaut, welches die nötigen 
Informationen / Platzhalter (als Primitives bzw. Strings) bereit hält.
Es sieht vereinfacht etwa so aus:   ()=Array
1
-Class/Type
2
 ├AssemblyQualifiedName
3
 └Member()
4
  ├Name
5
  ├ReturnType
6
  └Parameter()    <<-- Hier stehe ich momentan...
7
   ├Name
8
   └Type

Erstmal wollte ich fragen, ob diese Eigenschaften bereits ausreichen um 
alles typisiert und sicher "wiederherstellen" zu können. (Insbesondere 
bei den Membern in Verbindung mit den Parametern, aber ich denke JA). 
Außerdem suche ich nach dem "Fachbegriff" den man benutzt, wenn man 
Objekte oder Member von Daten "umschließt". (Das "Boxen" hatte ich 
gestern irgendwo aufgegriffen).

Anschließend suche ich eine geschickte Möglichkeit oder ein Beispiel um 
den Member eines Typs anhand dessen Parametern (über die Strings + 
Reflektion?) "wiederzufinden", um dessen Invoke, Getter und Setter / etc 
zur Laufzeit bereitstellen zu können. Es geht dabei (noch) nicht um den 
Member-Inhalt bzw. Wert... Ich hoffe die Grafik trägt ein wenig zur 
Verständlichkeit bei, und es ist klar was ich damit meine....

Danke schon mal
Gruß, TS

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

Nochmal etwas anders gefragt: Ich suche einen Code, der das unten 
stehende Beispiel auflöst. Die Lösung braucht keine direkten 
Definitionen (Dim) haben, muss nicht Syntax-Korrekt oder Lauffähig sein 
= <pseudocode>
Mir reichen ein paar Anhaltspunkte oder Ideen, um das gut zu lösen.

Daten vereinfacht:
1
Type = "Object"
2
├MemberName = "Equals"
3
├ReturnType = "Boolean"
4
├Par1.Name = "objA"
5
├Par1.Type = "Object"
6
├Par2.Name = "objB"
7
└Par2.Type = "Object"

Unterschiedliche MemberTypen (Method, Event, Property, etc) bieten 
natürlich unterschiedliche Funktionen und Eigenschaften, die jedoch in 
der "Basisklasse" MemberInfo vereinheitlicht sind, und sich daher in 
"Dim TrueMember As MemberInfo" speichern lassen sollten:

Code vereinfacht:
1
Dim TrueMember As MemberInfo = Nothing
2
For Each Member As MemberInfo In Type
3
    '# Richtigen Member anhand der Parameter finden:
4
    <WhatIsAGoodWayToFindTheMember?>
5
    If <Member.Name = MemberName> Then
6
        For Each Parameter As ParameterInfo in Member.
7
            If <Parameter.Name = Par1.Name> Then
8
                If <Parameter.ReturnType = Par1.Type>
9
                    <!=SoTiefVerschachtelt??>
10
                    <TrueMember = Member>
11
                    Exit For 
12
                End If
13
            End If
14
        Next Parameter
15
    End If  
16
Next Member
17
<...>
18
TrueMember.invoke(<Parameters>)

..."TrueMember" sollte dann (als Beispiel) die "Equals"-Methode zur 
Verfügung stellen bzw. bereithalten, die zwei Parameter benötigt! Wie 
finde ich diese am besten heraus = ? Ich glaube meine Vorgehensweise mit 
der tiefen Verschachtelung ist nicht richtig bzw. zu umständlich, aber 
ich finde kein passendes Beispiel im Netz...

[Edit:Schönheitsfehler + Anmerkung]

Noch zur Anmerkung: Das Laden & Speichern, das Datenmodell, dessen 
Serialisierung oder andere beteiligte Vorgänge sind nicht das Problem 
bzw. Thema des Threads. Sorry falls ich da zu weit ausgeholt habe.

Lediglich die Frage, ob die String-Daten dann auch reichen, und das 
Auffinden eines Members anhand der Parameter (<pseudo>Codebeispiel), 
bereitet mir gerade etwas Kopfschmerzen ^^

Wenn jemand einen Tipp hat, <positive Standardfloskeln> Danke

: Bearbeitet durch User
von Markus (Gast)


Lesenswert?

Schaue Dir doch mal die Klasse System.Type an. Das ist die "Zentrale" 
von .Net-Reflection. Eine Methode wie Equals kannst Du darüber z.B. mit 
GetMethod(string methodenName, Type[] parameterTypen) [C# Syntax!] 
finden. Du bekommst ein System.Reflection.MethodInfo Objekt zurück, über 
das Du die Methode mit den entsprechenden Parametern aufrufen kannst.

Grüße
Markus

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

Funktioniert!

Markus schrieb:
> [C# Syntax!]

- Egal, Dankeschöön!

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

Beim umstieg auf c# habe ich festgestellt, dass diese 
"Serialisierungs-Prozedur" für Objekte und Member schon fast fertig 
vorhanden ist. Jedenfalls besser zu lösen, als in Basic. Danke für die 
Hilfen ^^

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.