While writing some automated composition tests today, I found out the hard way that GetExportedValue<Lazy<T>> doesn't do what you might think it does at first sight. For example, the following throws because it tries to get a exported value for
the type Lazy<IFoo>, which is not an available part:
public class Program
public static void Main(string args)
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var container = new CompositionContainer(catalog);
var exports = container.GetExportedValue<Lazy<IFoo>>();
public interface IFoo
public class Foo : IFoo
As it turns out, if you want to pull a lazy export from a container, you just have to call GetExport<T> or GetExport<T,TMetaData>. This is quite obvious with hindsight, but I just got so used to using the shorthand GetExportedValue<T> that
I completely forgot about the existence of GetExport<T>.
This then led me to wonder why the GetExport and GetExportedValue methods work differently from the Import attribute. With the Import attribute, MEF inspects the type you are trying to import and gives special treatment to Lazy<T>. Shouldn't there
be an ImportLazy (and ImportManyLazy) attribute instead to make this intention explicit?