元数据视图必须是具有无参数或字典构造函数的具体 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。
这意味着 interface
和 abstract 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" 构造函数。
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。
这意味着 interface
和 abstract 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" 构造函数。