2

CompositionContractMistachException.NET 4.0 の MEF でカスタム属性クラスを使用すると、エラーが発生しました。

Unable to create an instance of the Metadata view '(snip).ModuleExportAttribute, (snip), Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' because a constructor could not be selected. Ensure that the type implements a constructor which takes an argument of type IDictionary<string, object>.

これが私のModuleExportAttributeクラスです。特別なことは何もありません:

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public sealed class ModuleExportAttribute : ExportAttribute
{
    public ModuleExportAttribute(string name) : base(typeof(IModule))
    {
        this.Name = name;
    }

    public string Name { get; private set; }
}

使い方はこんな感じです。

[ModuleExport("MyModule")]
public class MyModule : IModule
{ 
   ...
}

要求されたコンストラクターを追加すると、例外はなくなります。

ただし、この要件を述べているリファレンスは見つかりませんでした。反対に、そのようなコンストラクターなしでカスタム属性クラスを使用する多くの例とブログ投稿を見ました。ここで何か不足していますか?

4

1 に答える 1

8

これをどのようにインポートしようとしていますか?エラーはLazy<IModule, MetadataExportAttribute>、具象型をメタデータ型として使用するには、インターフェイスである必要があります。この場合、プロキシ型を生成するか、IDictionary<string,object>メタデータを渡すことができるようにします。

次のようなものを試してください:

public interface IModuleMetadata
{
  string Name { get; }
}

次に、インポートを次のように変更します。

[Import]
Lazy<IModule, IModuleMetadata> Module;

また、ExportAttribute に IModuleMetadata インターフェイスを実装して一貫性を保つようにしたいと考えていますが、これは絶対に必要というわけではありません。

于 2012-08-23T02:43:38.857 に答える