C#のリフレクション

アセンブリの一覧の取得

linenums:4

Assembly[] asms = AppDomain.CurrentDomain.GetAssemblies(); }}

アセンブリの取得

linenums:4

Assembly asm = System.Reflection.Assembly.Load("アセンブリ名") Assembly asm = Assembly.LoadFrom("DLLのパス") }}

インスタンスの生成

linenums:4

Assembly asm = Assembly.LoadFrom("DLLのパス") Type t = asm.GetType("ネームスペースを含むクラス名"); object obj = Activator.CreateInstance(t); }}

変数へのアクセス

GetFieldの第2引数のフラグによって、取得できる変数が変わる。

概要
BindingFlags.Publicpublic変数のみ
BindingFlags.NonPublicpublicではない変数も対象
BindingFlags.InstanceMSDNを見るとインスタンスメンバーを対象とのことなので、非staticなのか?非constなのか?要調査

BindingFlagsについてはMSDNを確認してください。

読み込み

linenums:4

Type baseObj = typeof(DataGridView); BindingFlags flags = BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance; FieldInfo val = baseObj.GetField("noDimensionChangeCount", flags); return (int)val.GetValue(this); }}

書き込み

linenums:4

Type baseObj = typeof(DataGridView); BindingFlags flags = BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Instance; FieldInfo val = baseObj.GetField("noDimensionChangeCount", flags); val.SetValue(this, value); }}

プロパティへのアクセス

プロパティのアクセスは変数と同じような方法で可能。

読み込み

#codeprettify{{ Type baseObj = typeof(DataGridView); BindingFlags flags = BindingFlags.GetProperty | BindingFlags.NonPublic | BindingFlags.Instance; PropertyInfo val = baseObj.GetProperty("NoSelectionChangeCount", flags); return (int)val.GetValue(this, null); }}

書き込み

linenums:4

Type baseObj = typeof(DataGridView); BindingFlags flags = BindingFlags.SetProperty | BindingFlags.NonPublic | BindingFlags.Instance; PropertyInfo val = baseObj.GetProperty("NoSelectionChangeCount", flags); val.SetValue(this, value, null); }}

メソッドの一覧を取得

linenums:4

Type baseObj = typeof(DataGridView); MethodInfo[] methods = baseObj.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance); foreach (MethodInfo info in methods) {

   prms = info.GetParameters();
   Console.WriteLine("Name  " + info.Name);
   foreach (ParameterInfo prm in prms)
   {
       Console.WriteLine("Param " + prm.ParameterType.Name);
   }
   Console.WriteLine("");

} }}

メソッドの呼び出し

linenums:4

MethodInfo method = null; method.Invoke(this, null); }}

リフレクションで変数やプロパティにアクセスする場合

プロパティを使って、擬似的に変数っぽく扱うことができる。
要はプロパティを作ってラップしているだけ。
privateやinternalな変数やプロパティも扱わないといけない場合に楽になる。

linenums:4

#region DataGridViewの変数(プロパティで再現) private int noDimensionChangeCount {

   get
   {
       Type baseObj = typeof(DataGridView);
       BindingFlags flags = BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance;
       FieldInfo val = baseObj.GetField("noDimensionChangeCount", flags);
       return (int)val.GetValue(this);
   }
   set
   {
       Type baseObj = typeof(DataGridView);
       BindingFlags flags = BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Instance;
       FieldInfo val = baseObj.GetField("noDimensionChangeCount", flags);
       val.SetValue(this, value);
   }

}

#endregion

#region DataGridViewのプロパティ private int NoSelectionChangeCount {

   get
   {
       Type baseObj = typeof(DataGridView);
       BindingFlags flags = BindingFlags.GetProperty | BindingFlags.NonPublic | BindingFlags.Instance;
       PropertyInfo val = baseObj.GetProperty("NoSelectionChangeCount", flags);
       return (int)val.GetValue(this, null);
   }
   set
   {
       Type baseObj = typeof(DataGridView);
       BindingFlags flags = BindingFlags.SetProperty | BindingFlags.NonPublic | BindingFlags.Instance;
       PropertyInfo val = baseObj.GetProperty("NoSelectionChangeCount", flags);
       val.SetValue(this, value, null);
   }

}

#endregion

void TestMethod() {

   // 変数のように扱う
   this.noDimensionChangeCount++;
   // プロパティ
   this.NoSelectionChangeCount--;

}

}}


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-10-22 (月) 11:34:20