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?