MEF(Managed Extensibility Framework)的 Metadata(元資料) 機制,讓匯出端能在 [Export] 時附加額外資訊(版本、作者、優先級…),匯入端透過 Lazy<T, TMetadata> 或強型別介面 IMetadata 讀取,實現「不實例化就能先看屬性、決定要不要載入」的延遲載入與篩選。
即使不手動加 [ExportMetadata],MEF 仍會自動產生包含 ExportTypeIdentity 等鍵值的字典,可透過 ExportDefinition.Metadata 檢視。
[Export(typeof(ITask))]
[ExportMetadata("Ver", 200)]
[ExportMetadata("Author", "小王")]
public class MyTask : ITask { /* ... */ }
[Import]
public Lazy<ITask, IDictionary<string, object>> TaskWithMeta { get; set; }
// 使用時
if (TaskWithMeta.Metadata.ContainsKey("Ver"))
Console.WriteLine($"版本:{TaskWithMeta.Metadata["Ver"]}");
// TaskWithMeta.Value 才會真正實例化
// 1. 定義介面 + MetadataViewImplementation
[MetadataViewImplementation(typeof(MyTaskMetadata))]
public interface ITaskMetadata {
int Ver { get; }
string Author { get; }
}
// 2. 實作類別(必須有 IDictionary 建構子)
public class MyTaskMetadata : ITaskMetadata {
private readonly IDictionary<string, object> _dic;
public MyTaskMetadata(IDictionary<string, object> dic) => _dic = dic;
public int Ver => _dic.TryGetValue("Ver", out var v) ? Convert.ToInt32(v) : -1;
public string Author => _dic.TryGetValue("Author", out var v) ? v.ToString() : "";
}
// 3. 匯入端改用強型別
[Import]
public Lazy<ITask, ITaskMetadata> TaskStrongMeta { get; set; }
// 使用
Console.WriteLine($"版本:{TaskStrongMeta.Metadata.Ver}, 作者:{TaskStrongMeta.Metadata.Author}");




[ExportMetadata("Priority", 10)],匯入時排序再載入。Ver,不符合拒絕載入。LicenseType 區分 Trial/Pro,UI 動態顯示功能。Lazy<T, TMeta> 只有呼叫 .Value 才建立實例,省資源。元資料是 MEF 從「單純掃描組件」進化為「智慧型外掛系統」的關鍵。善用強型別介面,讓編譯器幫你把字串鍵值拼錯的低級錯誤擋在編譯期。