簡體   English   中英

如何在C#中使用反射來自定義方法列表

[英]How to get custom a list of methods with reflection in C#

我一直在使用反射來創建用戶將在動態生成的菜單中使用的方法列表(我是一個整體)。 我在用:

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

但是,並非該類的所有公共方法都應出現在此菜單中,所以我想知道,是否可以使用某些標志來僅標記所需的方法?

然后使用此“自定義標志”通過反射獲取那些方法。 謝謝 :)。

使用自定義屬性:

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

另一種選擇是放棄制作插件的自定義方式,並使用一些現成的東西,例如MEF

您可以使用以下代碼。 它將返回公共方法和非公共方法。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM