MEF自定义属性类是否需要ctor(IDictionary <,>)

NS.*_*.X. 2 c# mef

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; }
}
Run Code Online (Sandbox Code Playgroud)

用法是这样的:

[ModuleExport("MyModule")]
public class MyModule : IModule
{ 
   ...
}
Run Code Online (Sandbox Code Playgroud)

添加问题构造函数后,异常就消失了.

但是,我找不到任何表明此要求的参考.相反,我看到许多示例和博客文章使用自定义属性类而没有这样的构造函数.我在这里错过了什么吗?

Wes*_*ard 8

你是如何尝试导入的?我怀疑这个错误是由你导入的东西引起的,比如Lazy<IModule, MetadataExportAttribute>在某种情况下是为了使用具体类型作为元数据类型它必须是一个接口,在这种情况下我们生成一个代理类型或者它必须是一个类型IDictionary<string,object>以便元数据可以传递给它.

尝试类似的东西:

public interface IModuleMetadata
{
  string Name { get; }
}
Run Code Online (Sandbox Code Playgroud)

然后将导入更改为:

[Import]
Lazy<IModule, IModuleMetadata> Module;
Run Code Online (Sandbox Code Playgroud)

我还想让我的ExportAttribute实现IModuleMetadata接口,以确保它们保持一致,但这不是绝对必要的.