可以使用MEF来获取标记为[Export]的类的System.Type吗?

时间:2010-08-11 16:46:33

标签: .net mef

我已成功使用MEF获取导出的类实例。但是,我遇到了一种情况,我需要枚举一组导出的派生类而不实例化它们。我查了CompositionContainer的文档,它似乎只能返回对象实例。

我知道我可以在每个派生类中都有一个静态Type字段并将其导出,或者自己进行反射,但是我想知道是否有一种内置方法来使用[Export]来标记类属性然后枚举他们的System.Type

7 个答案:

答案 0 :(得分:4)

正如leppie所说,没有内置的方法可以做到这一点。这是设计的。导出和类型之间不一定是一对一的映射(例如,任何数量的部件都可以具有String类型的属性导出)。此外,对于不同的编程模型,该部件可能来自配置文件或动态编程语言,因此尝试获取与其关联的CLR类型可能没有多大意义。

答案 1 :(得分:4)

根据您尝试执行的操作的范围,您可能还可以使用System.ComponentModel.Composition.ReflectionModel.ReflectionModelServices,它们是为了支持默认目录的缓存而引入的。假设您正在使用标准的属性编程模型并且您知道所有[导出]都在类型级别(即它们不在成员上),那么您可以在目录中的每个部分上调用GetPartType(部分)以获得类型。

正如丹尼尔指出你是否正在使用其他编程模型那么这对你不起作用,但如果你只使用MEF附带的默认目录,那么就应该完成这项工作。

答案 2 :(得分:4)

这不是你要找的吗?

    public static IEnumerable<Type> GetExportedTypes<T>()
    {
        return catalog.Parts
            .Where(part => IsPartOfType(part, typeof(T).FullName))
            .Select(part => ReflectionModelServices.GetPartType(part).Value);
    }

    private static bool IsPartOfType(ComposablePartDefinition part, string exportTypeIdentity)
    {
        return (part.ExportDefinitions.Any(
            def => def.Metadata.ContainsKey("ExportTypeIdentity") &&
                   def.Metadata["ExportTypeIdentity"].Equals(exportTypeIdentity)));
    }

答案 3 :(得分:1)

为此使用Reflection有什么问题吗?

如果不是,那是我的答案:)

编辑:

没有内置方法可以获取具有特定属性的程序集中的所有类型。

答案 4 :(得分:1)

通常,您不需要根据类型选择导出。相反,您可以根据元数据找到“正确”的导出。

查看Exports and metadata上的MEF编程指南部分。

答案 5 :(得分:1)

这可能有点旧,但我相信在这里发布正确答案很有用,因为这个问题首先出现在谷歌搜索中:

是的,你能做到这一点归功于Ricci Gian Maria

http://www.codewrecks.com/blog/index.php/2012/05/08/getting-the-list-of-type-associated-to-a-given-export-in-mef/

答案 6 :(得分:1)

您可以将“导出”属性视为自定义属性。当组件非常大时,我没有测试性能。

 Type[] GetType(Assembly assembly)
 {
     return assembly.GetTypes().Where(type => Attribute.GetCustomAttribute(type, typeof(ExportAttribute)).Length > 0).ToArray();
 }