私は MEF をよく理解していないので、うまくいけば、これがどのように機能すると思うかを簡単に修正できます。
MEF を使用して、クラスとその使用方法に関する情報を取得しようとしています。これを実現するために、メタデータ オプションを使用しています。私のインターフェイスと属性は次のようになります。
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; }
}
属性で装飾されたクラスは次のようになります。
[ExportMyInterface(typeof(string), 0.1, "whoo data!")]
[ExportMyInterface(typeof(int), 0.4, "asdfasdf!!")]
public class DecoratedClass : IMyInterface
{
}
インポートを使用しようとしているメソッドは次のようになります。
private void SomeFunction()
{
// CompositionContainer is an instance of CompositionContainer
var myExports = CompositionContainer.GetExports<IMyInterface, IMyInterfaceInfo>();
}
私の場合myExports
は常に空です。私の CompositionContainer には、私のカタログに 2 つの パーツ がありExportDefinitions
、両方とも次のものがありますContractName
: "MyNamespace.IMyInterface"。またMetadata
、エクスポートごとに正しくロードされます。
AllowMultiple
セッターを削除して、エクスポートされた属性を 1 つだけ含めると、myExports
変数には、ロードされたメタデータを含む単一のエクスポートが含まれるようになります。
私は何を間違っていますか?
編集:弱く型付けされたメタデータを使用すると、エクスポートが突然満足します:
var myExports = CompositionContainer.GetExports<IMyInterface, IDictionary<string, object>>();
理由はありますか?