0

メタデータ インターフェイスと属性の基本インターフェイスがあります。

public interface IBase
{
    string Name { get; }
}


public interface IAAAMetaData : IBase
{
    string[] Names { get;  }
}

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Method)]
public class AAAMetaData : ExportAttribute, IAAAMetaData
{
    public AAAMetaData(string contract)
    {
        Name = contract;
    }

    public AAAMetaData(string[] contracts)
    {
        Names = contracts;
    }
    public string Name { get; set; }
    public string[] Names { get; set; }
}


public interface IBBBMetaData : IBase
{
    string[] Names { get; }
}

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Method)]
public class BBBMetaData : ExportAttribute, IBBBMetaData
{

    public BBBMetaData(string contract)
    {
        Name = contract;
    }

    public BBBMetaData(string[] contracts)
    {
        Names = contracts;
    }
    public string Name { get; set; }
    public string[] Names { get; set; }
}

これが私のプラグインです:

    [AAAMetaData("Test1")]
    public void Plugin1(object sender, EventArgs e)
    {
        sender = "Plugin1";
    }

    [BBBMetaData("Test2")]
    public void Plugin2(object sender, EventArgs e)
    {
        sender = "Plugin2";
    }

エクスポートを取得しようとすると、間違った結果が得られます。エクスポートを取得するために使用しているコードは次のとおりです。

var exports = _container.GetExports<Action<object, EventArgs>, IAAAMetaData>();

結果としてGetExprts<T>()、リストに 2 つの項目が表示されます。リストを開いてその中の項目を確認すると、Plugin2 もインポートされました。ここで何が問題なのですか?IAAAMetaDataIBMetaDataは全く別物です。IAAAMetaDataにキャストすることさえできませんIBBBMetaData。ここで何が起こっているのか誰か説明できますか?

助けてくれてありがとう!

4

3 に答える 3

1

この背後にある理由は、両方のメタデータ インターフェイスがまったく同じプロパティを持っているためです。各プロパティの型と名前は同じです。たとえば、インターフェイスを次のように変更した場合:

public interface IAAAMetaData : IBase
{
    string[] AAA_Names { get;  }
}

public interface IBBBMetaData : IBase
{
    string[] BBB_Names { get; }
}

期待どおりの単一のエクスポートが得られます。

これは、エクスポートとメタデータ (CodePlex MEF サイト)のメタデータ フィルタリングと DefaultValueAttributeセクションで説明されています。

メタデータ ビューを指定すると、ビューで定義されたメタデータ プロパティを含むエクスポートのみに一致する暗黙的なフィルター処理が行われます。

もちろん、エクスポートされたメソッドの署名が異なる場合、これは起こりません。追加の変数を追加してみると、単一のエクスポートが得られます。ExportAttributeまた、別のアプローチとして、 and でコントラクト名を使用することもできますImportAttribute

于 2013-08-14T13:21:24.790 に答える
1

複数のジェネリック パラメーターを持つメソッドがあることは知りませんでしたが、コンパイラ エラーが発生していないため、実際に 1 つあると思います。ただし、2 番目の引数はおそらくコントラクト型ではありません。MEF のコントラクトは名前で指定されます。したがって、これを試してください:

var exports = _container.GetExports<Action<object, EventArgs>>( "Test1" );
于 2013-07-29T18:11:06.700 に答える