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.Public | public変数のみ |
BindingFlags.NonPublic | publicではない変数も対象 |
BindingFlags.Instance | MSDNを見るとインスタンスメンバーを対象とのことなので、非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--;
}
}}