実行時の型でExportされたオブジェクトをコンテナから取り出す

MEFの CompositionContainer って


public T GetExportedValue<T>();
というAPIはあるんですが、

public object GetExportedValue(Type type);
というAPIがないんですよね。実行時にしか型が決められない場合に困ります。

一応、そういった場合を考慮したようなAPIもあるんですがちょっと使いづらい。拡張メソッドで煩雑さを隠蔽化するといいかもしれないですね。


public static class CompositionContainerExtensions
{
public static object GetExportedValue(this CompositionContainer container, Type type)
{
if (type == null)
{
throw new ArgumentNullException();
}
var contractName = AttributedModelServices.GetContractName(type);
var importDefinition = new ContractBasedImportDefinition(contractName, type.FullName, Enumerable.Empty<KeyValuePair<string, Type>>(), ImportCardinality.ExactlyOne, false, false, CreationPolicy.Any);
var export = container.GetExports(importDefinition).FirstOrDefault();
return export != null ? export.Value : null;
}
}
とりあえず、上のような拡張メソッドでうごきました。