1

リフレクションを使用して、ユーザーが動的に生成されたメニューで使用するメソッドのリストを作成しています (私は団結しています)。私は使っている:

MethodInfo[] methodInfos =  myObject.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);

しかし、クラスのすべてのパブリック メソッドがこのメニューに表示されるわけではないので、必要なメソッドだけをマークするために使用できるフラグはあるのでしょうか?

そして、この「カスタム フラグ」を使用して、リフレクションを通じてこれらのメソッドを取得します。ありがとう :)。

4

2 に答える 2

7

カスタム属性を使用:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class MenuItemAttribute : Attribute
{
}

ユーザーがメソッドをマークできるようにします。

public class Foo
{
    [MenuItem]
    public void Bar() {}
}

次に、メソッド ルックアップで、この属性のメタデータを調べます。

var methodInfos = myObject
    .GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
    .Where(_ => _.IsDefined(typeof(MenuItemAttribute)));

ユーザーがメニュー パスを定義できるようにする必要がある場合は、次のようなカスタム パラメータで属性を拡張します。

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class MenuItemAttribute : Attribute
{
    public MenuItemAttribute(string menuPath)
    {
        MenuPath = menuPath;
    }

    public string MenuPath { get; }
}

もう 1 つのオプションは、プラグインを作成するための独自の方法を捨てて、箱から出してすぐに使用できるもの、たとえばMEFを使用することです。

于 2015-09-01T06:47:45.623 に答える
2

以下のコードを使用できます。パブリック メソッドと非パブリック メソッドの両方を返します。

MethodInfo[] methodInfos =  myObject.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);
于 2015-09-01T07:01:46.270 に答える