2012-08-22 36 views
2

在.NET 4.0的MEF中使用自定義屬性類時,我得到了一個CompositionContractMistachExceptionMEF自定義屬性類需要ctor(IDictionary <,>)

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 
{ 
    ... 
} 

添加問道構造後,異常消失。

但是,我找不到任何提及此要求的參考。相反,我看到許多使用自定義屬性類的例子和博客帖子,沒有這樣的構造函數。我在這裏錯過了什麼嗎?

回答

8

你是如何導入這個?我懷疑這個錯誤是由於你導入類似Lazy<IModule, MetadataExportAttribute>的東西造成的,在這種情況下yes是爲了使用具體類型作爲元數據類型,它必須是一個接口,在這種情況下,我們生成一個代理類型,或者它必須是一個類型一個IDictionary<string,object>,以便元數據可以傳遞給它。

試着這麼做:

public interface IModuleMetadata 
{ 
    string Name { get; } 
} 

然後你導入更改爲類似:

[Import] 
Lazy<IModule, IModuleMetadata> Module; 

我也喜歡有我ExportAttribute實現IModuleMetadata接口,以確保它們保持一致,但該ISN絕對有必要。

相關問題