2016-05-28 9 views
4

Ich habe eine Instanz des Typs object, von dem ich weiß, dass es ein Zeiger ist (kann leicht mit myobject.GetType().IsPointer verifiziert werden). Ist es möglich, den Wert des Zeigers durch Reflexion zu erhalten?Zeigerwert über Reflexion holen

Code so weit:

object obj = .... ; // type and value unknown at compile time 
Type t = obj.GetType(); 

if (t.IsPointer) 
{ 
    void* ptr = Pointer.Unbox(obj); 

    // I can obtain its (the object's) bytes with: 
    byte[] buffer = new byte[Marshal.SizeOf(t)]; 
    Marshal.Copy((IntPtr)ptr, buffer, 0, buffer.Length); 

    // but how can I get the value represented by the byte array 'buffer'? 
    // or how can I get the value of *ptr? 
    // the following line obviously doesn't work: 
    object val = (object)*ptr; // error CS0242 (obviously) 
} 


Nachtrag №1: Als das betreffende Objekt ist Werttyp -keine einen Referenz Typ-, ich nicht GCHandle::FromIntPtr(IntPtr) von GCHandle::Target gefolgt verwenden kann das erhalten Objekt Wert ...

+0

FromIntPtr erwartet ein GC-Handle. Es kann überhaupt nicht mit Zeigern arbeiten. Einfach darauf hinweisen. – usr

+0

'Ich kann seine Bytes erhalten mit:' Dies erhält nicht die Zeiger Bytes. Er erhält 4 oder 8 Bytes von der Speicherstelle, auf die obj zeigt. Was meinst du mit "der Zeiger Wert"? Es ist 'ptr'! – usr

+0

@usr: In Bezug auf Ihren ersten Kommentar: Ich weiß das, das ist der Grund, warum ich sagte, dass es nicht funktionieren wird, denn es ist ein Werttyp. zu deinem zweiten Kommentar: Ich erhalte die Bytes des Wertes - nicht die des Pointers. – Unknown6656

Antwort

3

Ich nehme an, was Sie brauchen, ist PtrToStructure. So etwas wie dieses:

if (t.IsPointer) { 
    var ptr = Pointer.Unbox(obj); 

    // The following line was edited by the OP ;) 
    var underlyingType = t.GetElementType(); 
    var value = Marshal.PtrToStructure((IntPtr)ptr, underlyingType); 
} 
+3

' TrimEnd ('*') 'omg :) Sie werden in der Hölle dafür brennen. – usr

+0

Nun, ich habe eine Exuse in Kommentar, so vielleicht Programmierer Gottes wird mir verzeihen :) Kennen Sie eine zuverlässige Möglichkeit, zugrunde liegenden Typ vom Zeigertyp zu bekommen? – Evk

+0

@Evk: Vielen Dank, Herr :) Ich habe auch Ihre vierte Codezeile bearbeitet;) – Unknown6656