我已成功使用MEF获取导出的类实例。但是,我遇到了一种情况,我需要枚举一组导出的派生类而不实例化它们。我查了CompositionContainer
的文档,它似乎只能返回对象实例。
我知道我可以在每个派生类中都有一个静态Type字段并将其导出,或者自己进行反射,但是我想知道是否有一种内置方法来使用[Export]
来标记类属性然后枚举他们的System.Type
。
答案 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
答案 6 :(得分:1)
您可以将“导出”属性视为自定义属性。当组件非常大时,我没有测试性能。
Type[] GetType(Assembly assembly)
{
return assembly.GetTypes().Where(type => Attribute.GetCustomAttribute(type, typeof(ExportAttribute)).Length > 0).ToArray();
}