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