2016-05-28 19 views
4

私はそれがポインタであることを知っているobjectのインスタンスを持っています。反射を介してポインタの値を取得することは可能ですか?反射によるポインタ値の取得

これまでコード:

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) 
} 


補遺№1:問題のオブジェクトがタイプ - 基準-not値型 あるように、私は得ることがGCHandle::Target続いGCHandle::FromIntPtr(IntPtr)を使用することはできませんオブジェクトの値...

+0

FromIntPtrは、GCハンドルが必要です。ポインタではまったく動作しません。ただこれを指摘してください。 – usr

+0

'私はそのバイトを得ることができます:'これはポインタバイトを取得しません。 objが指すメモリ位置から4バイトまたは8バイトを取得します。 "ポインタの値"はどういう意味ですか?それは 'ptr'です! – usr

+0

@usr:あなたの最初のコメントについて:私はそれがうまくいかないと言った理由を知っています。あなたの2番目のコメントについて:私は、ポインタのものではなく、値のバイトを取得します。 – Unknown6656

答えて

3

私はあなたが必要とするのはPtrToStructureです。このようなもの:

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 :)あなたはこれのために地獄を燃やすでしょう。 – usr

+0

さて、私はコメントで逸話を残しました。だからプログラマーの神は私を許してくれるでしょう:)ポインタ型から基になる型を得る信頼できる方法を知っていますか? – Evk

+0

@Evk:ありがとう、サー:私もあなたの4番目のコード行を編集;) – Unknown6656

関連する問題