開発メモ/C/Tips/リフレクション
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#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を見るとインスタンスメンバーを...
BindingFlagsについては[[MSDN:http://msdn.microsoft.com/ja...
***読み込み [#r71a9fb2]
#codeprettify(linenums:4){{
Type baseObj = typeof(DataGridView);
BindingFlags flags = BindingFlags.GetField | BindingFlags...
FieldInfo val = baseObj.GetField("noDimensionChangeCount"...
return (int)val.GetValue(this);
}}
***書き込み [#tb58add2]
#codeprettify(linenums:4){{
Type baseObj = typeof(DataGridView);
BindingFlags flags = BindingFlags.SetField | BindingFlags...
FieldInfo val = baseObj.GetField("noDimensionChangeCount"...
val.SetValue(this, value);
}}
**プロパティへのアクセス [#e3e57087]
プロパティのアクセスは変数と同じような方法で可能。
***読み込み [#m00514fc]
#codeprettify{{
Type baseObj = typeof(DataGridView);
BindingFlags flags = BindingFlags.GetProperty | BindingFl...
PropertyInfo val = baseObj.GetProperty("NoSelectionChange...
return (int)val.GetValue(this, null);
}}
***書き込み [#t3644b98]
#codeprettify(linenums:4){{
Type baseObj = typeof(DataGridView);
BindingFlags flags = BindingFlags.SetProperty | BindingFl...
PropertyInfo val = baseObj.GetProperty("NoSelectionChange...
val.SetValue(this, value, null);
}}
**メソッドの一覧を取得 [#zfb03b19]
#codeprettify(linenums:4){{
Type baseObj = typeof(DataGridView);
MethodInfo[] methods = baseObj.GetMethods(BindingFlags.No...
foreach (MethodInfo info in methods)
{
prms = info.GetParameters();
Console.WriteLine("Name " + info.Name);
foreach (ParameterInfo prm in prms)
{
Console.WriteLine("Param " + prm.ParameterType.Na...
}
Console.WriteLine("");
}
}}
**メソッドの呼び出し [#t300cf58]
#codeprettify(linenums:4){{
MethodInfo method = null;
// MethodInfoを取得した後にInvokeメソッドを呼び出す
method.Invoke(this, null);
}}
**リフレクションで変数やプロパティにアクセスする場合 [#x2...
プロパティを使って、擬似的に変数っぽく扱うことができる。~
要はプロパティを作ってラップしているだけ。~
privateやinternalな変数やプロパティも扱わないといけない場...
#codeprettify(linenums:4){{
#region DataGridViewの変数(プロパティで再現)
/// <summary>
/// 変数 noDimensionChangeCount
/// </summary>
private int noDimensionChangeCount
{
get
{
Type baseObj = typeof(DataGridView);
BindingFlags flags = BindingFlags.GetField | Bind...
FieldInfo val = baseObj.GetField("noDimensionChan...
return (int)val.GetValue(this);
}
set
{
Type baseObj = typeof(DataGridView);
BindingFlags flags = BindingFlags.SetField | Bind...
FieldInfo val = baseObj.GetField("noDimensionChan...
val.SetValue(this, value);
}
}
#endregion
#region DataGridViewのプロパティ
/// <summary>
/// int NoSelectionChangeCount
/// </summary>
private int NoSelectionChangeCount
{
get
{
Type baseObj = typeof(DataGridView);
BindingFlags flags = BindingFlags.GetProperty | B...
PropertyInfo val = baseObj.GetProperty("NoSelecti...
return (int)val.GetValue(this, null);
}
set
{
Type baseObj = typeof(DataGridView);
BindingFlags flags = BindingFlags.SetProperty | B...
PropertyInfo val = baseObj.GetProperty("NoSelecti...
val.SetValue(this, value, null);
}
}
#endregion
void TestMethod()
{
// 変数のように扱う
this.noDimensionChangeCount++;
// プロパティ
this.NoSelectionChangeCount--;
}
}}
終了行:
#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を見るとインスタンスメンバーを...
BindingFlagsについては[[MSDN:http://msdn.microsoft.com/ja...
***読み込み [#r71a9fb2]
#codeprettify(linenums:4){{
Type baseObj = typeof(DataGridView);
BindingFlags flags = BindingFlags.GetField | BindingFlags...
FieldInfo val = baseObj.GetField("noDimensionChangeCount"...
return (int)val.GetValue(this);
}}
***書き込み [#tb58add2]
#codeprettify(linenums:4){{
Type baseObj = typeof(DataGridView);
BindingFlags flags = BindingFlags.SetField | BindingFlags...
FieldInfo val = baseObj.GetField("noDimensionChangeCount"...
val.SetValue(this, value);
}}
**プロパティへのアクセス [#e3e57087]
プロパティのアクセスは変数と同じような方法で可能。
***読み込み [#m00514fc]
#codeprettify{{
Type baseObj = typeof(DataGridView);
BindingFlags flags = BindingFlags.GetProperty | BindingFl...
PropertyInfo val = baseObj.GetProperty("NoSelectionChange...
return (int)val.GetValue(this, null);
}}
***書き込み [#t3644b98]
#codeprettify(linenums:4){{
Type baseObj = typeof(DataGridView);
BindingFlags flags = BindingFlags.SetProperty | BindingFl...
PropertyInfo val = baseObj.GetProperty("NoSelectionChange...
val.SetValue(this, value, null);
}}
**メソッドの一覧を取得 [#zfb03b19]
#codeprettify(linenums:4){{
Type baseObj = typeof(DataGridView);
MethodInfo[] methods = baseObj.GetMethods(BindingFlags.No...
foreach (MethodInfo info in methods)
{
prms = info.GetParameters();
Console.WriteLine("Name " + info.Name);
foreach (ParameterInfo prm in prms)
{
Console.WriteLine("Param " + prm.ParameterType.Na...
}
Console.WriteLine("");
}
}}
**メソッドの呼び出し [#t300cf58]
#codeprettify(linenums:4){{
MethodInfo method = null;
// MethodInfoを取得した後にInvokeメソッドを呼び出す
method.Invoke(this, null);
}}
**リフレクションで変数やプロパティにアクセスする場合 [#x2...
プロパティを使って、擬似的に変数っぽく扱うことができる。~
要はプロパティを作ってラップしているだけ。~
privateやinternalな変数やプロパティも扱わないといけない場...
#codeprettify(linenums:4){{
#region DataGridViewの変数(プロパティで再現)
/// <summary>
/// 変数 noDimensionChangeCount
/// </summary>
private int noDimensionChangeCount
{
get
{
Type baseObj = typeof(DataGridView);
BindingFlags flags = BindingFlags.GetField | Bind...
FieldInfo val = baseObj.GetField("noDimensionChan...
return (int)val.GetValue(this);
}
set
{
Type baseObj = typeof(DataGridView);
BindingFlags flags = BindingFlags.SetField | Bind...
FieldInfo val = baseObj.GetField("noDimensionChan...
val.SetValue(this, value);
}
}
#endregion
#region DataGridViewのプロパティ
/// <summary>
/// int NoSelectionChangeCount
/// </summary>
private int NoSelectionChangeCount
{
get
{
Type baseObj = typeof(DataGridView);
BindingFlags flags = BindingFlags.GetProperty | B...
PropertyInfo val = baseObj.GetProperty("NoSelecti...
return (int)val.GetValue(this, null);
}
set
{
Type baseObj = typeof(DataGridView);
BindingFlags flags = BindingFlags.SetProperty | B...
PropertyInfo val = baseObj.GetProperty("NoSelecti...
val.SetValue(this, value, null);
}
}
#endregion
void TestMethod()
{
// 変数のように扱う
this.noDimensionChangeCount++;
// プロパティ
this.NoSelectionChangeCount--;
}
}}
ページ名: