2
タイトルのため申し訳ありませんが、明示的ではありません。リフレクトでフィールドを参照する方法
Further to my precedent question私は動的に(リフレクションによって)取得されたイベントオブジェクトにメソッドをサブスクライブします。問題のオブジェクトは、コントロールのフィールドです。
public void SubscribeEvents(Control control)
{
Type controlType = control.GetType();
FieldInfo[] fields = controlType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
MethodInfo method = typeof(Trace).GetMethod("WriteTrace");
// "button1" hardcoded for the sample
FieldInfo f = controlType.GetField("button1", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
// "Click" hardcoded for the sample
EventInfo eInfo = f.FieldType.GetEvent("Click");
if (eInfo != null)
{
EventHandler dummyDelegate = (s, e) => WriteTrace(s, e, eInfo.Name);
Delegate realDelegate = Delegate.CreateDelegate(eInfo.EventHandlerType, dummyDelegate.Target, dummyDelegate.Method);
eInfo.AddEventHandler(?????, realDelegate); // How can I reference the variable button1 ???
}
}
変数 'button1'の参照方法はわかりません。私はこのようなものを試してみた:
public void SubscribeEvents(Control control)
{
Type controlType = control.GetType();
FieldInfo[] fields = controlType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
MethodInfo method = typeof(Trace).GetMethod("WriteTrace");
// "button1" hardcoded for the sample
FieldInfo f = controlType.GetField("button1", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
// "Click" hardcoded for the sample
EventInfo eInfo = f.FieldType.GetEvent("Click");
Type t = f.FieldType;
object o = Activator.CreateInstance(t);
f.GetValue(o);
if (eInfo != null)
{
EventHandler dummyDelegate = (s, e) => WriteTrace(s, e, eInfo.Name);
Delegate realDelegate = Delegate.CreateDelegate(eInfo.EventHandlerType, dummyDelegate.Target, dummyDelegate.Method);
eInfo.AddEventHandler(o, realDelegate); // Why can I refer to the variable button1 ???
}
}
しかし、私はここに例外があります。
f.GetValue(o);
System.ArgumentExceptionのをしたタイプに定義されたフィールド「ボタン1」が「WindowsFormsApplication1.Form1」は=未処理 メッセージ'System.Windows.Forms.Button'型の対象オブジェクト上のフィールドではありません。
:あなたは任意のオブジェクトのフィールドの値を取得するために、このようなメソッドを使用することができます
:これで
問題:button1(と他のボタン)でうまく動作しますが、カスタムフィールドのときはnullを返します。 オブジェクトo = f。 GetValue(コントロール); // fがMyClass型のフィールドのフィールド情報である場合、o = null fは良い値を返します。 – Florian
@Florian: "カスタムフィールド"とは何ですか? – cdhowie
@cdhowie: プライベートMyClass _myClass; //「カスタム」フィールド(悪い変換? private System.Windows.Forms.Button button1; – Florian