MEF GetExports <T, TMetaDataView> não retornando nada com AllowMultiple = True
Eu não entendo muito bem o MEF, então espero que isso seja uma simples correção de como eu acho que funciona.
Estou tentando usar o MEF para obter algumas informações sobre uma classe e como ela deve ser usada. Estou usando as opções de metadados para tentar alcançar isso. Minhas interfaces e atributos são assim:
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; }
}
A classe que é decorada com o atributo se parece com isso:
[ExportMyInterface(typeof(string), 0.1, "whoo data!")]
[ExportMyInterface(typeof(int), 0.4, "asdfasdf!!")]
public class DecoratedClass : IMyInterface
{
}
O método que está tentando usar a importação se parece com isto:
private void SomeFunction()
{
// CompositionContainer is an instance of CompositionContainer
var myExports = CompositionContainer.GetExports<IMyInterface, IMyInterfaceInfo>();
}
No meu casomyExports
está sempre vazio. No meu CompositionContainer, eu tenho uma parte no meu catálogo que tem doisExportDefinitions
, ambos com os seguintesContractName
: "MyNamespace.IMyInterface". oMetadata
também é carregado corretamente por minhas exportações.
Se eu remover oAllowMultiple
setter e incluir apenas um atributo exportado, omyExports
variável agora tem a única exportação com seus metadados carregados.
O que estou fazendo de errado?
EDIT: Se eu usar Metadados fracamente digitados, minha exportação é repentinamente satisfeita:
var myExports = CompositionContainer.GetExports<IMyInterface, IDictionary<string, object>>();
Alguma idéia por quê?