繁体   English   中英

如何通过类名称获取MEF导出值?

[英]How can I get a MEF exported value by a class name?

我有一个称为MainWindow的窗口和一个称为MainWindowViewModel的视图模型。

我想调查一下MEF的容器,看看是否可以找到<WindowName>ViewModel

我的代码是:

CompositionContainer container;

var catalog = new AssemblyCatalog(typeof(App).Assembly);
container = new CompositionContainer(catalog);
container.ComposeParts(this);
container.SatisfyImportsOnce(this);

我看到了方法

container.GetExports(Type, Type, String)

但它只允许我导出第一个Type参数。 我只有一个字符串名称。

我想做类似的事情

allExports.FirstOrDefault(e => e.GetType().Name.StartsWith(something))

有没有一种方法可以通过string name获取导出的值?

由于allExports是IEnumerable <Lazy <T >>,因此如果不创建关联值(通过调用.Value)然后检查值类型,就无法获取每个导出的类型。 创造所有价值并不是一件好事。 通过分析typeof(Lazy <T>),您可以获得的只是typeof(T),仅此而已。

元数据是一个很好的方法:

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class ExportViewModelAttribute : ExportAttribute, IViewModelMetadata
{
    public ExportViewModelAttribute(Type declaredType)
        : base(null, typeof(IViewModel))
    {
        this.DeclaredType = declaredType;
    }

    public Type DeclaredType { get; private set; }
}

接口为:

public interface IViewModelMetadata
{
    Type DeclaredType { get; } 
}

然后您使用导出:

[ExportViewModel(typeof(MyViewModel))]
public class MyViewModel: BaseViewModel, IViewModel 
{
    [...]
}

然后使用关于元数据的where子句检索它

IViewModel vm = container.GetExports<IViewModel, IViewModelMetadata>().Where(i => i.Metadata.DeclaredType == typeof(MyViewModel)).Select(i => i.Value).FirstOrDefault();

或搭配

i => i.Metadata.DeclaredType.Name == "mysearchedViewModel"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM