如何获取MEF中ExportFactory导出的ITask实现类具体类型?
嘿,我刚好处理过类似的MEF场景,给你两种可行的方案来获取ITask派生类的具体类型:
方案1:通过实例化获取具体类型(最直接)
如果你的Task实例化成本不高,也没有什么副作用,这是最直接的方式。利用ExportFactory.CreateExport()创建实例的生命周期上下文,拿到实例后调用GetType()就能得到具体类型:
IEnumerable<ExportFactory<ITask, IMetaData>> myTasks; // 假设已完成MEF组合 foreach (var taskFactory in myTasks) { // 使用using自动释放实例资源,避免内存泄漏 using (var exportContext = taskFactory.CreateExport()) { ITask taskInstance = exportContext.Value; Type concreteTaskType = taskInstance.GetType(); // 这里可以用concreteTaskType做你需要的操作,比如打印类型名 Console.WriteLine($"当前任务的具体类型:{concreteTaskType.FullName}"); } }
说明:
ExportFactory.CreateExport()返回的ExportLifetimeContext<T>会管理实例的生命周期,using块会自动调用Dispose()释放资源,非常安全。- 不管你的派生类是Task1、Task2还是其他,
GetType()都会返回对应的具体类型。
方案2:通过元数据预存类型(无需实例化)
如果你的Task实例化成本很高,或者不想触发实例化的副作用,可以在导出组件时把类型信息放到元数据里,之后直接从元数据读取,完全不需要创建实例:
第一步:修改元数据接口,添加类型属性
public interface IMetaData { // 保留你原来的元数据属性,新增TaskType属性 Type TaskType { get; } }
第二步:导出组件时指定元数据
[Export(typeof(ITask))] // 把当前派生类的类型写入元数据 [ExportMetadata("TaskType", typeof(Task1))] public class Task1 : ITask { // 你的Task1实现代码 }
第三步:遍历myTasks时直接读取元数据
foreach (var taskFactory in myTasks) { Type concreteTaskType = taskFactory.Metadata.TaskType; Console.WriteLine($"当前任务的具体类型:{concreteTaskType.FullName}"); }
说明:
- 这种方式完全跳过实例化,性能更好,但需要你在导出每个Task组件时手动配置元数据,要注意保证元数据里的
TaskType和实际导出的类型一致,避免手动写错。
内容的提问来源于stack exchange,提问作者Alonzzo2
相关产品推荐
相关产品推荐

