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

C# 如何通过类名获取MEF导出值?,c#,mef,C#,Mef,我有一个名为MainWindow的窗口和一个名为MainWindowViewModel的视图模型 我想查看MEF的容器,看看是否可以找到ViewModel 我的密码是: CompositionContainer container; var catalog = new AssemblyCatalog(typeof(App).Assembly); container = new CompositionContainer(catalog); container.ComposeParts(this)

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

我想查看MEF的容器,看看是否可以找到
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)
但它只允许我导出第一个
类型
参数。我只有一个字符串名

我想做点像

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

有没有一种方法可以通过
字符串名
获取导出值?

因为AllExport是IEnumerable>的,所以如果不创建关联的值(通过调用.value),然后检查值类型,就无法获取每个导出类型。这并不是创造所有价值的一件好事。通过分析typeof(Lazy),可以得到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();

由于allExports是IEnumerable>的,因此如果不创建关联的值(通过调用.value),然后检查值类型,就无法获取每个导出的类型。这并不是创造所有价值的一件好事。通过分析typeof(Lazy),可以得到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();

由于allExports是IEnumerable>的,因此如果不创建关联的值(通过调用.value),然后检查值类型,就无法获取每个导出的类型。这并不是创造所有价值的一件好事。通过分析typeof(Lazy),可以得到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();

由于allExports是IEnumerable>的,因此如果不创建关联的值(通过调用.value),然后检查值类型,就无法获取每个导出的类型。这并不是创造所有价值的一件好事。通过分析typeof(Lazy),可以得到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();