Frage zu DatenTypen in Generica

Rene42

Erfahrenes Mitglied
Hallo miteinander,

ich habe eine Frage zu Generica. Hoffe, dass mir hier jemand weiterhelfen kann:

Ich habe folgende Funktion:

Code:
Public Function SagDenTyp(Of Datentyp) As String

 Return GetType(Datenyp).Name

End Function

Soweit alles Super wenn ich die Funktion aufrufe:

Code:
SagDenTyp(Of String) --> "String"
SagDenTyp(Of Int32) --> "Int32"

Nun habe ich die Beschreibung eines Objektes als Type:

Code:
 Dim Beschreibung As Type = TestObjekt.GetType

Kann ich mit dieser "Beschreibung" meine Funktion SagDenTyp aufrufen?
In der Art:

Code:
 SagDenTyp(Of Beschreibung)

Dies geht nicht, da Beschreibung ja eine Variable ist und keine Deklaration. Komme ich an diese Deklaration heran?

Ansonsten würde ich nur den Weg sehen...

Code:
Public Function SagDenTyp(Objekt As Object) As String

 Return Objekt.GetType.Name

End Function

..erscheint mir allerdings unelegant nach dem ich gerade den Nutzen von Generica erkannt habe.
 

Halfbax

Erfahrenes Mitglied
Darf ich fragen warum du nicht direkt den Aufruf machst?
Code:
Dim name = theObject.GetType().Name

LG
Halfbax
 

Rene42

Erfahrenes Mitglied
Klar :)

In Wirklichkeit ist die Funktion um einiges komplexer. Ich habe nur ein einfache Funktion gewählt um mein Problem darstellen zu können.
 

Spyke

Premium-User
sowas?
Code:
Public Function SagDenTyp(derTypDa As Type) As String

 Return derTypDa.Name

End Function
ansonsten versteh ich die Frage nicht

Nachtrag: Also im Prinzip Type als Parameter angeben
 

Rene42

Erfahrenes Mitglied
Grundsätzlich könne ich meine Funktion so definieren, dass diese einen Parameter mit Typ "Type" erwartet.
Ich habe die Funktion so definiert, dass diese eine Deklaration erwartet. Also "String" oder "Int32". Bekomme ich aus dem Type eine Deklaration die von einer generischen Funktion akzeptiert wird. Also nicht nur den Namensstring?
 

Rene42

Erfahrenes Mitglied
So nun versuche ich nochmal das Problem darzulegen.

Ich habe eine Funktion Laden. Die anhand einer ID benutzerdefinierte Objekte aus einer XML-Datei lädt.

Code:
 Public Function Laden(Of DatenTyp)(ID As Int32) As DatenTyp

  'Typ des zu erstellenden Objektes auslesen
  Dim Beschreibung As Type = GetType(DatenTyp)

 'Objekt mit dem Standardkonstruktor aus Beschreibung erzeugen
  Dim Objekt As Object = Beschreibung.GetConstructor(New Type() {}).Invoke(New Type() {})

  'Alle Felder aus dem Object mit den Daten versorgen
  For Each Feld As Reflection.FieldInfo In Beschreibung.GetFileds

   If BenutzerTyp(Feld.FieldTyp) Then

    'Bei einem Benutzertyp diesen Laden
    Feld.SetValue(Laden(Of Feld.FieldTyp)(Daten), Objekt) '<--Hier weiß ich nicht wie die Funktion aufgerufen werden kann das ich den Type Feld.FieldTyp als Wert für DatenTyp übergeben kann

   Else
    
    'Bei keinem BenutzerTyp Wert setzen
    Feld.SetValue(Daten, Objekt)
 
  Next

 Return Objekt

 End Function

Hoffe das ist verständlicher. Bin ja schon dankbar, dass sich jemand in das Problem reinfuchst.

Darf man das gar nicht könnte ich die Funktion mit
Code:
Public Function Laden(Beschreibung As Type, ID As Int32) As Object
überladen. Erschien mir nur irgendwie nicht elegant. (So habe ich es gemacht bevor ich Generica kannte)
 
Zuletzt bearbeitet:

Spyke

Premium-User
Deine variante mit der überladung passte schon.
Du willst den Wert ja eh blos per Reflection an dein Objekt weitergeben.

Generic passt an der Stelle auch eher weniger find ich.

Generic wird eher interessanter wenn du mit abgeleiteten Klassen (Vererbung) arbeitest,
und für spezielle Programmbereich dann erweiterungen deiner Objekte erwartest, die aber über standard Routinen befüllt werden sollen.
 

Rene42

Erfahrenes Mitglied
Dann werde ich das mit der Überladung machen. Vielen Dank für die Mühe.

Dachte nur das wäre ein Weg um dem Rückgabetyp Object aus dem Weg zu gehen.