C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: ポインタ変数のリフレクション


(過去ログ 42 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■21791 / inTopicNo.1)  ポインタ変数のリフレクション
  
□投稿者/ めろぱん (3回)-(2008/07/09(Wed) 21:17:54)

分類:[C#] 

2008/07/09(Wed) 21:23:21 編集(投稿者)

開発環境:Visual Studio 2008
使用言語:Visual C#

こんばんは、めろぱんと申します。

ポインタ変数のリフレクションについて教えてください。

あるクラスにprivateなメンバ変数があるとします。
このメンバ変数に外部から(無理やり)アクセスする方法として
リフレクションがあると思いますが、
メンバ変数がポインタでもアクセスできるできるものなのでしょうか?
と質問したのは、やってみたらビルドエラーが発生してしまったためです。

例をあげると以下のような感じです。
(コードに意味はありません)

using System.Reflection;

namespace AAA
{
  unsafe public class ClassA
  {
    private int* m_pData; // アクセスしたいポインタ変数
    ・・・

    public void Method1()
    {
      if( m_pData == null)
      {
        ・・・
      }
    }
  }

  unsafe public class ClassB
  {
    public void Method2()
    {
      ClassA classA = new ClassA();
      int data = 0;

      Type type = typeof(ClassA);
      FieldInfo fieldinfo = type.GetField("m_pData", BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Instance);
      fieldinfo.SetValue(classA, &data); // ここでビルドエラー
      classA.Method1();
      ・・・
    }
  }
}

FieldInfo.SetValueの第2引数はObject型を渡すことになっており、
ここにポインタを渡しているのがよくなさそうなのですが、
ではどうやって渡せば?というところで行き詰まっています。
解決策をご存知の方、ご教示いただけると幸いです。

ちなみに、そもそも外部からアクセスしたいならprivateにするな、
と言われそうですが、
例におけるClassA.Method1()の単体テストを目的としています。
例にも書きましたが、m_pDataがnullかどうかで分岐する部分の
テストをしたいためです。

よろしくお願いします。

引用返信 編集キー/
■21792 / inTopicNo.2)  Re[1]: ポインタ変数のリフレクション
□投稿者/ Hongliang (280回)-(2008/07/09(Wed) 21:39:22)
ポインタを IntPtr にして渡してやればいいです。
引用返信 編集キー/
■21793 / inTopicNo.3)  Re[1]: ポインタ変数のリフレクション
□投稿者/ 魔界の仮面弁士 (781回)-(2008/07/09(Wed) 21:52:46)
No21791 (めろぱん さん) に返信
> メンバ変数がポインタでもアクセスできるできるものなのでしょうか?

こんな感じでできないかな? (未検証)

object dataPointer = Pointer.Box(&data, typeof(int*));
fieldinfo.SetValue(classA, dataPointer);
引用返信 編集キー/
■21853 / inTopicNo.4)  Re[2]: ポインタ変数のリフレクション
□投稿者/ めろぱん (4回)-(2008/07/11(Fri) 00:23:33)
Hongliangさん、魔界の仮面弁士さん
ご回答ありがとうございます。

IntPtr、Pointer.Box共にできました。
状況に応じて使い分けようと思います。
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -