C# 选择具有MEF约定的无参数构造函数

C# 选择具有MEF约定的无参数构造函数,c#,mef,C#,Mef,我试图在.NETFramework4.5中使用MEF约定,但我一直坚持认为应该简单一些 我想导出一组类,除了一个有多个构造函数的类之外,所有的类都在工作,所以默认情况下,MEF调用的构造函数中的参数最多,这会导致中断,因为参数没有导入,我想应该是这样的 无论如何,我希望通过告诉MEF导出不带参数的构造函数来确保它能正常工作 var registration = new RegistrationBuilder(); registration.ForTypesDerivedFrom<Test

我试图在.NETFramework4.5中使用MEF约定,但我一直坚持认为应该简单一些

我想导出一组类,除了一个有多个构造函数的类之外,所有的类都在工作,所以默认情况下,MEF调用的构造函数中的参数最多,这会导致中断,因为参数没有导入,我想应该是这样的

无论如何,我希望通过告诉MEF导出不带参数的构造函数来确保它能正常工作

var registration = new RegistrationBuilder();

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

因此,我知道我需要在SelectConstructor中做一些事情,但找不到调用无参数构造函数应该说的话。

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

好的,你唯一缺少的步骤是:

var registration = new RegistrationBuilder();

registration.ForTypesDerivedFrom<TestStepResult>()
    .Export<TestStepResult>()
    .SelectConstructor(xxx);
registration.ForTypesDerivedFrom<TestStepResult>()
  .Export<TestStepResult>()
  .SelectConstructor(ctorInfos => ctorInfos[0]);
其中,ctorInfos包含用于所述导出的ctor数组。

一种方法是:

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();
                      });

注意,它包括一些简单的错误处理。如果没有parameterless.ctor,它将返回第一个可用的。但这可能不是你需要的。您必须决定如何处理此情况。

这是一种方法,但这意味着需要访问包含构造函数的代码,而我可能无法访问该代码。不幸的是,由于某些原因,这会导致超出范围的异常感谢您的回答。出于某种原因,它引发InvalidOperationException,表示序列不包含匹配元素。@Firedragon这是因为从TestStepResult派生的零件没有无参数的.ctor。您需要确保所有这些部分都有一个无参数的.ctor,或者需要添加错误处理。我将更新我的答案,包括一些简单的错误处理。感谢您的回复,这是有意义的。我相信我最终会理解这一切,它开始变得更有意义,所以感谢你的帮助!我想,当特定的构造函数没有担保时,让错误检查能够调用正确的构造函数可能会变得更加复杂implementation@Firedragon我同意这会变得相当复杂。如果你能让它保持简单,它将为你节省大量的时间。这是很好的,但如果一个类没有任何用户定义的构造函数,它就会失败。我认为C自动提供了一个默认构造函数,但在使用上面的第一个构造函数时,这似乎不起作用。看来FirstOrDefault才是解决问题的方法。谢谢你的帮助!