4

Foo複数のメタデータ オプションを使用してタイプをエクスポートしたい:

public interface IFoo
{
    void Do ();
}

[ExportFoo ("Bar", "1.0")]
[ExportFoo ("Baz", "1.0")]
[ExportFoo ("Baz", "2.0")]
public class Foo : IFoo
{
    public void Do () {}
}

私はExportFooAttributeこのように宣言しました:

public interface IFooMeta
{
    string Name { get; }
    string Version { get; }
}

[MetadataAttribute, AttributeUsage (AttributeTargets.Class, AllowMultiple = true)]
public class ExportFooAttribute : ExportAttribute, IFooMeta
{
    public string Name { get; private set; }
    public string Version { get; private set; }

    public ExportFooAttribute (string name, string version) : base(typeof(IFoo))
    {
        Name = name;
        Version = version;
    }
}

ドキュメントによると、が にAllowMultiple設定されている場合true、メタデータには実際には元のメタデータのプロパティの配列が含まれているため、次の方法で型をインポートします。

public interface IFooMultiMeta
{
    string[] Name { get; }
    string[] Version { get; }
}

public class Program
{
    [ImportMany]
    public List<Lazy<IFoo, IFooMultiMeta>> Foos { get; set; }

    private static void Main ()
    {
        new Program().MainInternal();
    }

    private void MainInternal ()
    {
        new CompositionContainer(new AssemblyCatalog(Assembly.GetExecutingAssembly())).ComposeParts(this);
        foreach (Lazy<IFoo, IFooMultiMeta> lazyFoo in Foos)
            for (int i = 0; i < lazyFoo.Metadata.Name.Length; i++)
                Console.WriteLine("* {0} {1}", lazyFoo.Metadata.Name[i], lazyFoo.Metadata.Version[i]);
        Console.WriteLine(Equals(Foos[0].Metadata, Foos[1].Metadata));
        Console.ReadKey();
    }
}

Foo3 つの値の配列を含む with メタデータの 1 つのインスタンスを取得することを期待していました。しかし、私はこれを得ました:

* Baz 2.0
* Baz 1.0
* Bar 1.0
* Baz 2.0
* Baz 1.0
* Bar 1.0
* Baz 2.0
* Baz 1.0
* Bar 1.0
False

さらに悪いことに、メタデータ インスタンスが異なるため、重複を適切に除外することさえできません。

質問: 1 つのクラスをメタデータ プロパティの複数の組み合わせを満たすものとして適切にエクスポートするにはどうすればよいですか?

完全なサンプル: http://pastebin.com/WyjN95gr

4

1 に答える 1