mef基于元数据的导出

时间:2017-03-07 10:45:03

标签: c# .net wpf mef

我正在尝试根据其元数据导出模块。 compositioncontainer在其目录中包含两部分

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

1 个答案:

答案 0 :(得分:2)

问题在于这一行

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

您需要指定要获取的模块的合同类型。在您的情况下,您必须这样做:

var listOfModules = compositioncontainer.GetExportedValues<IModule>().ToList();
然后可以使用specific_module LINQ方法填充/形成

Select

来源: