如何以编程方式使用MEF导出的方法?

时间:2016-12-02 10:32:03

标签: mef

我使用带有[Export]属性的MEF导出方法,我需要使用Container(使用GetExports获取方法)来使用此方法。 GetExports返回一个我不知道如何从中提取MethodInfo的ExportedDelegate对象。 使用调试器进行检查我认为它是一个私有属性,我很想用反射来提取它,但它并不是这样做的正确方法。

有什么想法吗?

此问题与this one不同。我没有尝试使用[导入],我必须从容器中获取并使用该方法。

1 个答案:

答案 0 :(得分:0)

好的家伙,所以这是一个棘手的,但我要离开这里作为参考。

您所要做的就是将从MEF返回的值转换为ExportedDelegate并以正确的方式调用CreateDelegate:

这设置了我们想要的导入:

var importDefinition = new ImportDefinition(e => true, obj.GetType().FullName, ImportCardinality.ZeroOrMore, false, false);

var objectsWithMethods = container.GetExports(importDefinition)
                .Where(x => x.Value is IYourInterface)
                .Select(x => x.Value)
                .ToList();                       

这将获取上面找到的对象的方法(使用objectsWithMethod在foreach中迭代objectsWithMethods):

 var endPointsImportDefinition = new ImportDefinition(e => true, objectsWithMethod.GetType().FullName, ImportCardinality.ZeroOrMore, false, false); 
 var endPoints = container.GetExports(endPointsImportDefinition)
                        .Where(x => x.Value is ExportedDelegate)
                        .Select(x => x.Value)
                        .ToList();

最后要使用MethodInfo(允许你运行方法):

var endPointMethod = (endPoint as ExportedDelegate).CreateDelegate(typeof(Delegate)).GetMethodInfo();

也可能是:

var endPointMethod = (endPoint as ExportedDelegate).CreateDelegate(typeof(Delegate)).Method;

希望它对任何人都有帮助!