使用MEF约定选择参数less构造函数

时间:2013-04-15 14:10:20

标签: c# mef

我正在尝试在.NET Framework 4.5中使用MEF约定,并坚持我认为应该简单的事情。

我想导出一组类,除了具有多个构造函数的类外,所有类都在工作,因此默认情况下MEF调用具有最多参数的构造函数,这会导致中断,因为参数不是导入的我猜是怎么回事。

无论如何,我想通过告诉MEF导出没有参数的构造函数来确保它的工作原理。

var registration = new RegistrationBuilder();

registration.ForTypesDerivedFrom<TestStepResult>()
    .Export<TestStepResult>()
    .SelectConstructor(xxx);

所以我知道我需要在SelectConstructor中做一些事情,但是找不到用来调用没有参数的构造函数的内容。

3 个答案:

答案 0 :(得分:1)

你能不能简单地使用[ImportingConstructor]属性装饰首选构造函数?

答案 1 :(得分:1)

一种方法是:

registration.ForTypesDerivedFrom<TestStepResult>()
   .Export<TestStepResult>()
   .SelectConstructor(ctorInfos => 
                      {
                          var parameterLessCtor = ctorInfos.FirstOrDefault(ci => ci.GetParameters().Length == 0);
                          if (parameterLessCtor != null)
                              return parameterLessCtor;
                          else
                              return ctorInfos.First();
                      });

请注意,它包含一些简单的错误处理。如果没有无参数的.ctor,则返回第一个可用的.ctor。这可能不是你需要的。你必须决定如何处理这种情况。

答案 2 :(得分:0)

AFAIK,您唯一缺少的一步是:

registration.ForTypesDerivedFrom<TestStepResult>()
  .Export<TestStepResult>()
  .SelectConstructor(ctorInfos => ctorInfos[0]);

其中ctorInfos包含您有关导出的ctors数组。