Variablen als anderen Datentyp interpretieren? Generics-Funktion mit Beschränkung auf best. Typen?

16/09/2007 - 02:10 von Markus Teich | Report spam
Hallo NG,

ich suche eine Funktion, mit der ich eine Variable eines bestimmten Typs
erstellen kann und diese dann als eine Variable eines anderen Types
interpretieren. z.B. eine Single Variable mit dem Wert 123.456 als
Integer interpretieren (beide Typen sind ja 4 Bytes groß). Dabei soll
dann nicht 123 als Integer herauskommen, sondern die gesetzten Bytes der
Single Variable eben als eine Integervariable interpretiert werden, ohne
diese zu àndern.
Dazu habe ich versucht mir eine Generische Funktion zu erstellen:

Public Shared Function TypeConvert(Of T1 As {Int16, Int32, Int64,
Single, Double, Byte, Char}, T2 As {Int16, Int32, Int64, Single, Double,
Byte, Char})(ByVal Source() As T1, ByRef Dest() As T2) As Boolean
Dim T1Size As Integer = SizeOf(GetType(T1))
If T1Size > SizeOf(GetType(T2)) Then Return False
Dim ptr As IntPtr = AllocCoTaskMem(T1Size)
Copy(Source, 0, ptr, Source.Length)
Copy(ptr, Dest, 0, Source.Length)
Return True
End Function

leider scheint es nicht möglich zu sein bei den generischen Typen eine
Beschrànkung auf bestimmte Typen festzulegen. Ich erhalte für jeden Typ
in den geschweiften Klammern die Fehlermeldung:
Die Typeinschrànkung muss entweder eine Klasse, eine Schnittstelle oder
ein Typparameter sein.

Weis jemand eine Lösung für dieses "generische Problem" oder am besten
gleich für das Hauptproblem Daten unter anderen Datantypen
interpretieren zu können?

MfG, Markus

mailto:schachmat@gmail.com
 

Lesen sie die antworten

#1 Thomas Scheidegger [MVP]
16/09/2007 - 02:30 | Warnen spam
Hallo Markus


z.B. eine Single Variable mit dem Wert 123.456 als
Integer interpretieren (beide Typen sind ja 4 Bytes groß). Dabei soll
dann nicht 123 als Integer herauskommen, sondern die gesetzten Bytes der
Single Variable eben als eine Integervariable interpretiert werden



vorab, solches ist in rein managed .NET sehr unüblich, gehört eigentlich nur zu unmanaged Interop-Szenarien.

Für die Umwandlung ggf naheliegender, via Byte-Array:
BitConverter.GetBytes, BitConverter.ToInt32 ...

Dim ptr As IntPtr = AllocCoTaskMem(T1Size)



wenn schon, dann dazu Marshal.FreeCoTaskMem nicht vergessen.



Thomas Scheidegger - MVP .NET - 'NETMaster'
http://www.cetus-links.org/oo_dotnet.html - http://dnetmaster.net/

Ähnliche fragen