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

わんくま同盟

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

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


(過去ログ 42 を表示中)
■21791 / )  ポインタ変数のリフレクション
□投稿者/ めろぱん (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かどうかで分岐する部分の
テストをしたいためです。

よろしくお願いします。

返信 編集キー/


管理者用

- Child Tree -