MEF GetExports <T, TMetaDataView> zwracanie nic z AllowMultiple = True

Nie rozumiem MEF bardzo dobrze, więc mam nadzieję, że jest to prosta poprawka na to, jak myślę, że to działa.

Próbuję użyć MEF, aby uzyskać pewne informacje o klasie i sposobie jej użycia. Używam opcji metadanych, aby to osiągnąć. Moje interfejsy i atrybuty wyglądają tak:

public interface IMyInterface
{
}

public interface IMyInterfaceInfo
{
    Type SomeProperty1 { get; }
    double SomeProperty2 { get; }
    string SomeProperty3 { get; }
}

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class ExportMyInterfaceAttribute : ExportAttribute, IMyInterfaceInfo
{
    public ExportMyInterfaceAttribute(Type someProperty1, double someProperty2, string someProperty3)
        : base(typeof(IMyInterface))
    {
        SomeProperty1 = someProperty1;
        SomeProperty2 = someProperty2;
        SomeProperty3 = someProperty3;
    }

    public Type SomeProperty1 { get; set; }
    public double SomeProperty2 { get; set; }
    public string SomeProperty3 { get; set; }
}

Klasa ozdobiona atrybutem wygląda tak:

[ExportMyInterface(typeof(string), 0.1, "whoo data!")]
[ExportMyInterface(typeof(int), 0.4, "asdfasdf!!")]
public class DecoratedClass : IMyInterface
{
}

Metoda, która próbuje użyć importu, wygląda tak:

private void SomeFunction()
{
    // CompositionContainer is an instance of CompositionContainer
    var myExports = CompositionContainer.GetExports<IMyInterface, IMyInterfaceInfo>();
}

W moim przypadkumyExports jest zawsze pusty. W moim CompositionContainer mam część w moim katalogu, która ma dwaExportDefinitions, obie z następującymiContractName: „MyNamespace.IMyInterface”. TheMetadata jest również poprawnie ładowany na mój eksport.

Jeśli usunęAllowMultiple setter i zawiera tylko jeden wyeksportowany atrybut, themyExports zmienna ma teraz pojedynczy eksport z załadowanymi metadanymi.

Co ja robię źle?

EDYCJA: Jeśli używam słabo wpisanych metadanych, mój eksport zostanie nagle spełniony:

var myExports = CompositionContainer.GetExports<IMyInterface, IDictionary<string, object>>();

Jakieś pomysły dlaczego?

questionAnswers(1)

yourAnswerToTheQuestion