gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:44:35 24 4
gpt4 key购买 nike

我有一个 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
{
...
}

添加请求的构造函数后,异常消失。

但是,我找不到任何说明此要求的引用资料。相反,我看到许多使用自定义属性类而没有此类构造函数的示例和博客文章。我在这里遗漏了什么吗?

最佳答案

你打算如何导入这个?我怀疑该错误是由于您导入了类似 Lazy<IModule, MetadataExportAttribute> 的内容引起的在这种情况下是为了使用具体类型作为元数据类型,它必须是一个接口(interface),在这种情况下我们生成代理类型或者它必须是采用 IDictionary<string,object> 的类型。以便可以将元数据传递给它。

尝试这样的事情:

public interface IModuleMetadata
{
string Name { get; }
}

然后将您的导入更改为:

[Import]
Lazy<IModule, IModuleMetadata> Module;

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

关于c# - MEF 自定义属性类是否需要 ctor(IDictionary<,>),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12082177/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com