元数据视图必须是具有无参数或字典构造函数的具体 class

A metadata view must be a concrete class with a parameterless or dictionary constructor

System.Composition.Hosting.CompositionFailedException: The type 'ITranslatorMetaData' cannot be used as a metadata view. A metadata view must be a concrete class with a parameterless or dictionary constructor.

我刚刚开始在 PCL 中使用 MEF(使用 nuget Microsoft.Composition)。我相信这是 "lightweight" MEF。在我实施的 class 我有

[Export(typeof(ITranslator))]
[ExportMetadata("Source", "Microsoft")]
[ExportMetadata("Order", "2")]

我有一个名为 ITranslatorMetaData 的接口

public interface ITranslatorMetaData
{
    [DefaultValue("Unknown")]
    string Source { get; }

    [DefaultValue(Int32.MaxValue)]
    int Order { get;  }
}

最后,我尝试使用

导入它们
    [ImportMany]
    private Lazy<ITranslator, ITranslatorMetaData>[] _translators { get; set; }

我做错了什么?看来这应该行得通。

更新我试过了没用。

[Export(typeof(ITranslator)),
    ExportMetadata("Source", "Microsoft"),
    ExportMetadata("Order", "2")]

更新2我确实发现了一个错误,订单应该是一个整数而不是一个字符串。但是在指定

之后我仍然得到同样的错误
[Export(typeof(ITranslator)),
    ExportMetadata("Source", "Microsoft"),
    ExportMetadata("Order", 2)]

更新 3 一个提议的解决方案建议我不应该为元数据使用接口,尽管 http://mef.codeplex.com/wikipage?title=Exports%20and%20Metadata&referringTitle=Guide 中的 MEF 示例清楚地显示了为元数据使用接口,而不是具体的 class.

如执行说明所述,您必须为元数据使用具体的 class。

这意味着 interfaceabstract class(编辑:也 static class)类型是不允许的,因为 MEF 代码在上拉时不知道要构造什么必要的元数据。

因此,如果您像这样将 interface ITranslatorMetaData 更改为 class TranslatorMetaData

public class TranslatorMetaData
{
    [DefaultValue("Unknown")]
    string Source { get; set; }

    [DefaultValue(Int32.MaxValue)]
    int Order { get; set; }
}

代码可以编译。

关于构造函数,在没有其他构造函数的情况下,假定一个无参数的public构造函数,因此上面的代码适合必要的参数。但是,指定带参数的构造函数将留下没有无构造函数参数的 class,并导致相同的错误,除非使用错误中提到的 "dictionary" 构造函数。