2017-03-07 68 views
2

我想基於其元數據導出模塊。 的compositioncontainer包含兩個部分在其目錄基於元數據的mef導出

[1] = {Modules.ProjectModule} 
[0] = {Modules.DocumentsModule} 

GetExportedValues回報什麼。

[ImportMany(typeof(IModule))] 
private List<Lazy<IModule, IModuleInfo>> specific_modules { get; set; } 
public ShellViewModel() 
{ 
    DirectoryCatalog catalaog = new DirectoryCatalog(System.AppDomain.CurrentDomain.BaseDirectory + @"\Modules", "*.*"); 
    CompositionContainer compositioncontainer = new CompositionContainer(catalaog); 
    specific_modules = compositioncontainer.GetExportedValues<Lazy<IModule, IModuleInfo>>().ToList(); 
    Documents = specific_modules.FirstOrDefault<Lazy<IModule, IModuleInfo>>().Metadata.DisplayName; 
} 

public interface IModuleInfo 
{ 
    string DisplayName { get; } 
    string Description { get; } 
    string Version { get; } 
} 

public interface IModule 
{ 
    string Name { get; } 
} 

namespace Modules 
{ 
    [Export(typeof(IModule))] 
    [ExportMetadata("DisplayName", "Documents")] 
    [ExportMetadata("Description", "gérer les docs")] 
    [ExportMetadata("Version", "2.1")] 

    public class DocumentsModule : IModule 
    { 
     public string Name 
     { 
      get 
      { 
       return "Documents"; 
      } 
     } 
    } 
} 

回答

2

問題是此行

specific_modules = compositioncontainer.GetExportedValues<Lazy<IModule, IModuleInfo>>().ToList(); 

你需要指定你想要得到的模塊的合同類型。在你的情況,你就必須做到這一點:

然後
var listOfModules = compositioncontainer.GetExportedValues<IModule>().ToList(); 

specific_module可填充/使用Select LINQ方法形成。

來源: