我正在尝试根据其元数据导出模块。
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";
}
}
}
}
答案 0 :(得分:2)
问题在于这一行
specific_modules = compositioncontainer.GetExportedValues<Lazy<IModule, IModuleInfo>>().ToList();
您需要指定要获取的模块的合同类型。在您的情况下,您必须这样做:
var listOfModules = compositioncontainer.GetExportedValues<IModule>().ToList();
然后可以使用specific_module
LINQ方法填充/形成 Select
。
来源: