MEF GetExports <T, TMetaDataView> returns nothing with AllowMultiple = True
I do not understand MEF very well, so hopefully this is a simple decision on how I think this works.
I am trying to use MEF to get some information about the class and how to use it. I use metadata options to try to achieve this. My interfaces and attribute are as follows:
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 class decorated with an attribute is as follows:
[ExportMyInterface(typeof(string), 0.1, "whoo data!")]
[ExportMyInterface(typeof(int), 0.4, "asdfasdf!!")]
public class DecoratedClass : IMyInterface
{
}
The method that tries to use the import is as follows:
private void SomeFunction()
{
// CompositionContainer is an instance of CompositionContainer
var myExports = CompositionContainer.GetExports<IMyInterface, IMyInterfaceInfo>();
}
In my case, it is myExportsalways empty. In my CompositionContainer, I have a Part in my directory, which has two ExportDefinitions, both with the following ContractName: "MyNamespace.IMyInterface". Metadataalso loading correctly for my export.
AllowMultiple , myExports .
?
EDIT: , :
var myExports = CompositionContainer.GetExports<IMyInterface, IDictionary<string, object>>();
, ?
, MEF AllowMultiple = true. , , , - , , , AllowMultiple , IMyInterfaceInfo.
, . , , ExportAttribute:
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class ExportMyInterfaceAttribute : Attribute, IMyInterfaceInfo
{
public ExportMyInterfaceAttribute(Type someProperty1, double someProperty2, string someProperty3)
{
SomeProperty1 = someProperty1;
SomeProperty2 = someProperty2;
SomeProperty3 = someProperty3;
}
public Type SomeProperty1 { get; set; }
public double SomeProperty2 { get; set; }
public string SomeProperty3 { get; set; }
}
, 3 , :
[Export(typeof(IMyInterface))]
[ExportMyInterface(typeof(string), 0.1, "whoo data!")]
[ExportMyInterface(typeof(int), 0.4, "asdfasdf!!")]
public class DecoratedClass : IMyInterface
, . , IDictionary . - :
public class MyInterfaceInfoView
{
public IMyInterfaceInfo[] Infos { get; set; }
public MyInterfaceInfoView(IDictionary<string, object> aDict)
{
Type[] p1 = aDict["SomeProperty1"] as Type[];
double[] p2 = aDict["SomeProperty2"] as double[];
string[] p3 = aDict["SomeProperty3"] as string[];
Infos = new ExportMyInterfaceAttribute[p1.Length];
for (int i = 0; i < Infos.Length; i++)
Infos[i] = new ExportMyInterfaceAttribute(p1[i], p2[i], p3[i]);
}
}
var myExports = CompositionContainer.GetExports<IMyInterface, MyInterfaceInfoView>();