#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--;
}

}}


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS