首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Effective C# 原則 42:使用屬性簡化反射 (下)

     編輯:關於C語言

建立命令處理器範例

以 [CommandHandler] 標記類別,[DynamicMenu("命令文字", "父選單")] 標記屬性:


[CommandHandler]
public class CmdHandler
{
    [DynamicMenu("Test Command", "Parent Menu")]
    public EventHandler CmdFunc
    {
        get
        {
            if (theCmdHandler == null)
                theCmdHandler = new EventHandler(this.DynamicCommandHandler);
            return theCmdHandler;
        }
    }
    private void DynamicCommandHandler(object sender, EventArgs args) { ... }
}

動態發現與安裝

啟動時掃描外掛目錄組件,透過反射尋找標記屬性的類別與屬性,建立選單項:


foreach (Type t in asm.GetExportedTypes())
{
    if (t.GetCustomAttributes(typeof(CommandHandlerAttribute), false).Length > 0)
    {
        var obj = t.GetConstructor(Type.EmptyTypes).Invoke(null);
        foreach (PropertyInfo p in t.GetProperties())
        {
            var attrs = p.GetCustomAttributes(typeof(DynamicMenuAttribute), false);
            foreach (Attribute at in attrs)
            {
                var dym = at as DynamicMenuAttribute;
                if (dym != null)
                {
                    var h = p.GetGetMethod().Invoke(obj, null) as EventHandler;
                    UpdateMenu(dym.ParentText, dym.MenuText, h);
                }
            }
        }
    }
}

屬性的價值

  • 宣告執行意圖,簡化反射查找。
  • AttributeUsage 限制套用目標(類別、屬性等),編譯期檢查減少錯誤。
  • 攜帶語法與語意資訊(選單文字、父選單)。

善用屬性與反射,可建立動態可配置系統,將責任從開發者移至編譯器,提升可維護性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved