1

ILSpyのおかげで、MenuItemクラスには MenuItemData という名前の内部クラスが含まれており、この内部クラスにはonDrawItemという名前の内部メンバーが含まれていることがわかりました。

MenuItem を指定して、メンバー onDrawItem に対応するオブジェクトを取得したいと考えています。しかし、私ができることは、オブジェクト自体ではなく、FieldInfo を取得することだけです。

これが私のコードです:

            Dim obj As Object
            Dim fi As FieldInfo
            Dim item as System.Windows.Forms.MenuItem
            Dim mType As System.Type

            mType = item.GetType()

            mType = mType.GetMember("MenuItemData", BindingFlags.NonPublic)(0)

            fi = mType.GetField("onDrawItem", BindingFlags.Static Or BindingFlags.Instance Or BindingFlags.NonPublic)

            obj = fi.GetValue(item)

最後の行に到達すると、次のようなエラーが表示されます (翻訳されています)。

タイプ「System.Windows.Forms.MenuItem+MenuItemData」で定義されたフィールド「onDrawItem」は、タイプ「System.Windows.Forms.MenuItem」のターゲット オブジェクトのフィールドではありません

最後の行で GetValue 関数に渡すオブジェクトがわかりません。どんな手掛かり?

- - 編集 - -

私の目標は、 DrawItemという名前の menuItem の基本 eventHandlerを削除することです。理解を深めるために、この投稿と受け入れられた回答の関数を参照してください。RemoveClickEvent

4

2 に答える 2

3
System.Type menuItemType = typeof(System.Windows.Forms.MenuItem);

System.Type menuItemDataType = menuItemType.GetNestedType("MenuItemData",
    System.Reflection.BindingFlags.NonPublic);

System.Reflection.FieldInfo fieldInfoOnDrawItem= menuItemDataType.GetField("onDrawItem", 
    System.Reflection.BindingFlags.NonPublic | 
    System.Reflection.BindingFlags.Instance |
    System.Reflection.BindingFlags.GetField ); 

追加: 値を取得するには、 のインスタンスへの参照が必要ですMenuItemData。これを行うには、インスタンスGetValuedataフィールドを介して値を取得し、それを使用する必要があります。MenuItem

System.Windows.Forms.MenuItem menuItem = new System.Windows.Forms.MenuItem();
System.Reflection.FieldInfo fieldInfoData = menuItemType.GetField("data",
    System.Reflection.BindingFlags.NonPublic |
    System.Reflection.BindingFlags.Instance |
    System.Reflection.BindingFlags.GetField);

object dataField = fieldInfoData.GetValue(menuItem);
object onDrawItem = fieldInfoOnDrawItem.GetValue(dataField);
于 2012-06-01T14:07:16.983 に答える
0

onDrawItemは、特にその宣言タイプに関するコメントを考えると、イベントである必要があります。私はMSDNでこのページを見つけました。これはあなたを助けることができるはずです。

Dim tExForm As Type = assem.GetType("ExampleForm")
Dim exFormAsObj As Object = Activator.CreateInstance(tExForm)
Dim evClick As EventInfo = tExForm.GetEvent("Click")
Dim tDelegate As Type = evClick.EventHandlerType
Dim miHandler As MethodInfo = GetType(Example).GetMethod("LuckyHandler", BindingFlags.NonPublic Or BindingFlags.Instance)

その最後のビットはあなたにとって最も役立つはずです。イベントにリンクされているメソッドのメソッド情報を取得します。これを使用して、メソッドを起動するか、メソッドにリンクすることができます。

このページを更新することも役立つかもしれません。

于 2012-06-01T14:23:50.770 に答える