К сожалению, без доступа к тому, что делает конструктор C
, вам почти не повезло. Кажется, что конструктор C
хочет инициализировать экземпляр B
, используя сам тип ... обеспечивает ли он какой-либо механизм перехвата инициализации B
в C
?
Если бы C
должен был принять экземпляр B
, вы могли бы просто передать составной экземпляр B
в конструктор. Если вы хотите экспортировать закрытый тип, C
, вы можете сделать что-то вроде:
public class MefAdapter<T, TExport>
{
private readonly Func<T, TExport> _factory = CreateFactory();
private readonly T _arg;
[ImportingConstructor]
public MefAdapter(T arg)
{
_arg = arg;
}
[Export]
public TExport Export
{
get { return _factory(_arg); }
}
internal static Func<T, TExport> CreateFactory()
{
var tArg = typeof(T);
var tExport = typeof(TExport);
var arg = Expression.Parameter(tArg, "arg");
var ctor = tExport.GetConstructor(new[] { tArg });
var ctorExp = Expression.New(ctor, arg);
return Expression.Lamda<Func<T, TExport>>(ctorExp, arg).Compile();
}
}
(Это основано на статье с разрешением Марка Симанна ).
При этом C
должен выглядеть так:
public class C
{
public C(B b)
{
}
}
Этот закрытый тип может быть удовлетворен автоматическим созданием B
:
var typeCatalog = new TypeCatalog(typeof(MefAdapter<C>));
var catalog = new AggregateCatalog(new DirectoryCatalog("."), typeCatalog);
var container = new CompositionContainer(catalog);
var c = container.ComposeExportedValue<C>();
// This instance of C should have a composed instance of B injected.