#contents *C#のリフレクション [#o49aad69] **アセンブリの一覧の取得 [#kef2510b] #codeprettify(linenums:4){{ Assembly[] asms = AppDomain.CurrentDomain.GetAssemblies(); }} **アセンブリの取得 [#w389145f] #codeprettify(linenums:4){{ Assembly asm = System.Reflection.Assembly.Load("アセンブリ名") Assembly asm = Assembly.LoadFrom("DLLのパス") }} **インスタンスの生成 [#q7ffd79f] #codeprettify(linenums:4){{ Assembly asm = Assembly.LoadFrom("DLLのパス") Type t = asm.GetType("ネームスペースを含むクラス名"); object obj = Activator.CreateInstance(t); }} **変数へのアクセス [#oc74baf2] GetFieldの第2引数のフラグによって、取得できる変数が変わる。 |値|概要|h |BindingFlags.Public|public変数のみ| |BindingFlags.NonPublic|publicではない変数も対象| |BindingFlags.Instance|MSDNを見るとインスタンスメンバーを対象とのことなので、非staticなのか?非constなのか?要調査| BindingFlagsについては[[MSDN:http://msdn.microsoft.com/ja-jp/library/system.reflection.bindingflags.aspx]]を確認してください。 ***読み込み [#r71a9fb2] #codeprettify(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); }} ***書き込み [#tb58add2] #codeprettify(linenums:4){{ Type baseObj = typeof(DataGridView); BindingFlags flags = BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Instance; FieldInfo val = baseObj.GetField("noDimensionChangeCount", flags); val.SetValue(this, value); }} **プロパティへのアクセス [#e3e57087] プロパティのアクセスは変数と同じような方法で可能。 ***読み込み [#m00514fc] #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); }} ***書き込み [#t3644b98] #codeprettify(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); }} **メソッドの一覧を取得 [#zfb03b19] #codeprettify(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(""); } }} **メソッドの呼び出し [#t300cf58] #codeprettify(linenums:4){{ MethodInfo method = null; // MethodInfoを取得した後にInvokeメソッドを呼び出す method.Invoke(this, null); }} **リフレクションで変数やプロパティにアクセスする場合 [#x292620d] プロパティを使って、擬似的に変数っぽく扱うことができる。~ 要はプロパティを作ってラップしているだけ。~ privateやinternalな変数やプロパティも扱わないといけない場合に楽になる。 #codeprettify(linenums:4){{ #region DataGridViewの変数(プロパティで再現) /// <summary> /// 変数 noDimensionChangeCount /// </summary> 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のプロパティ /// <summary> /// int NoSelectionChangeCount /// </summary> 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--; } }}