Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 是否可以使用MEF获取系统。标记为[Export]的类的类型?_.net_Mef - Fatal编程技术网

.net 是否可以使用MEF获取系统。标记为[Export]的类的类型?

.net 是否可以使用MEF获取系统。标记为[Export]的类的类型?,.net,mef,.net,Mef,我已经成功地使用MEF获得了导出的类实例。然而,我遇到了一种情况,我需要枚举一组导出的派生类,而不实例化它们。我查阅了CompositionContainer的文档,它似乎只能返回对象实例 我知道我可以在每个派生类中都有一个静态类型字段并将其导出,或者进行我自己的反射,但我想知道是否有一种内置方法,可以使用[export]属性标记类,然后枚举它们的系统。Type使用反射进行此操作有什么问题吗 如果没有,那就是我的答案:) 编辑: 没有内置的方法可以获取具有特定属性的程序集中的所有类型 正如莱皮所

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


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

使用反射进行此操作有什么问题吗

如果没有,那就是我的答案:)

编辑:


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

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

根据您尝试执行的操作的范围,您可能还可以使用System.ComponentModel.Composition.ReflectionModel.ReflectionModelServices,这些API是为支持默认目录的缓存而引入的。假设您使用的是标准属性编程模型,并且您知道所有[Export]都处于类型级别(即,它们不在成员中),那么您可以对目录中的每个零件调用GetPartType(part)来获取类型


正如Daniel指出的,如果您使用其他编程模型,那么这将不适用于您,但是如果您只使用MEF附带的默认目录,那么它应该可以完成这项工作。

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


请查看上的MEF编程指南部分。

这不是您想要的吗

    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)));
    }
public静态IEnumerable GetExportedTypes()
{
退货目录。零件
.Where(part=>IsPartOfType(part,typeof(T).FullName))
.Select(part=>ReflectionModelServices.GetPartType(part).Value);
}
私有静态bool IsPartOfType(ComposablePartDefinition部分,字符串exportTypeIdentity)
{
退货(part.ExportDefinitions.Any)(
def=>def.Metadata.ContainsKey(“ExportTypeIdentity”)&&
定义元数据[“ExportTypeIdentity”].Equals(ExportTypeIdentity));
}

这可能有点老了,但我相信在这里发布正确的回答是很好的,因为在谷歌搜索中,问题排在第一位:

是的,你能做到这一点,多亏了里奇·吉安·玛丽亚


您可以将导出属性视为自定义属性。当程序集非常大时,我还没有测试性能

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

不,使用反射并没有什么“错误”,但由于发现(导出)类型是MEF的一个重要部分,我认为它将为获取这些信息提供支持。这几乎是我得出的结论。谢谢。刚刚添加了缺少的方法IsPartOfType,使这项工作(至少对我来说)