C# MEF ImportMany类型参数:优雅解决方案?

C# MEF ImportMany类型参数:优雅解决方案?,c#,.net,metadata,mef,C#,.net,Metadata,Mef,我是MEF的新手,希望在我目前正在开发的项目中使用它 想法:我想编写一个FileLoader,它将T作为我试图加载的类型的参数,并为我提供支持加载到此类型的文件扩展名的数据。类型加载器以类的形式提供,在解决方案中分散为Func,应该由MEF收集到IEnumerable中。然后从元数据中收集支持的文件类型 这就是我试图做到的: [导出(类型(IFileLoader))] 类文件加载程序:IFileLoader { 静态文件加载器() { Register(()=>{returnnewfileloa

我是MEF的新手,希望在我目前正在开发的项目中使用它

想法:我想编写一个
FileLoader
,它将
T
作为我试图加载的类型的参数,并为我提供支持加载到此类型的文件扩展名的数据。类型加载器以类的形式提供,在解决方案中分散为
Func
,应该由MEF收集到
IEnumerable
中。然后从元数据中收集支持的文件类型

这就是我试图做到的:

[导出(类型(IFileLoader))]
类文件加载程序:IFileLoader
{
静态文件加载器()
{
Register(()=>{returnnewfileloader();});
}
[ImportMany(typeof(Func))//这里有问题!!!
私有IEnumerable加载程序{get;set;}
公共文件加载器()
{
//托多:在这里作曲
}
public IEnumerable GetSupportedFiletypes()
{
抛出新的NotImplementedException();
}
公共TData LoadFromFile(字符串文件名)
{
抛出新的NotImplementedException();
}
}
////////////////在班里的其他地方//////////////////////////////////////
[导出(类型(函数))]
[SupportedFileType(FileTypeDescription=“信号插值文件”,FileTypeMask=“*.interpol.xml”)]
公共合成信号插值文件加载器(字符串文件名)
{
抛出新的NotImplementedException();//TODO
}
////////////////////////////////////////////////////////////////////////////////
[元数据属性]
[AttributeUsage(AttributeTargets.Method,AllowMultiple=true)]
公共类SupportedFileTypeAttribute:属性
{
公共字符串FileTypeDescription{get;set;}
公共字符串文件类型掩码{get;set;}
公共支持的FileTypeAttribute()
:base()
{ } 
}
问题是在ImportMany属性的typeof中不能有泛型参数。现在,我当然可以尝试导入所有类型加载器并循环它们,但我无法想象这是一个优雅的解决方案

最好的方法是什么


提前感谢。

我不认为通过
加载程序
属性循环是件坏事。您只需要执行一次(或者每次重新编译时,如果您设置了
AllowRecomposition=True


我会让元数据指定它加载的数据类型,并根据它提取想要的加载程序。这就是元数据的基本用途。如果要使用
Lazy
,甚至不会创建不使用的类型。

如果不在
ImportMany
中指定类型并让它尝试匹配类型本身,会发生什么?我从来没有在这样的情况下尝试过,但我很想看看这是否有效。我也很喜欢下面阿迪的回答。