【发布时间】:2013-08-08 17:58:02
【问题描述】:
我怎样才能使下面的代码工作?它抛出一个错误,说有两个相同名称的元数据属性,但我不明白为什么。
报错信息如下:
System.ComponentModel.Composition.dll 中出现“System.InvalidOperationException”类型的未处理异常
附加信息:成员或类型“ConsoleApplication2.DoSomeMagic”包含多个名为“PluginName”的元数据条目。元数据条目可能来自 ExportMetadataAttribute 或来自自定义元数据属性的属性。删除重复条目或启用名为“PluginName”的元数据条目,以通过 ExportMetadataAttribute 上的 IsMultiple 属性或自定义元数据属性上的 AttributeUsage.AllowMultiple 允许多个条目。
class Program
{
static void Main(string[] args)
{
var program = new Program();
program.Test();
}
private void Test()
{
//Export
var catalog = new AssemblyCatalog(this.GetType().Assembly);
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
//Import Meta Data
var import1 = container.GetExports<IMagic1, IPluginAttributeView>().Select(e => new PluginAttribute(e.Metadata));
}
}
public interface IPluginAttributeView
{
string PluginName { get; set; }
string PluginConfigurationName { get; set; }
string PluginCategory { get; set; }
Type PluginType { get; set; }
}
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class PluginAttribute1 : ExportAttribute, IPluginAttributeView
{
public string PluginName { get; set; }
public string PluginConfigurationName { get; set; }
public string PluginCategory { get; set; }
public Type PluginType { get; set; }
public PluginAttribute1(string pluginName, string pluginConfigurationName, string pluginCategory, Type pluginType)
: base(pluginType)
{
PluginName = pluginName;
PluginConfigurationName = pluginConfigurationName;
PluginCategory = pluginCategory;
PluginType = pluginType;
}
}
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class PluginAttribute2 : ExportAttribute, IPluginAttributeView
{
public string PluginName { get; set; }
public string PluginConfigurationName { get; set; }
public string PluginCategory { get; set; }
public Type PluginType { get; set; }
public PluginAttribute2(string pluginName, string pluginConfigurationName, string pluginCategory, Type pluginType) : base(pluginType)
{
PluginName = pluginName;
PluginConfigurationName = pluginConfigurationName;
PluginCategory = pluginCategory;
PluginType = pluginType;
}
}
public class PluginAttribute
{
public string PluginName { get; set; }
public string PluginConfigurationName { get; set; }
public string PluginCategory { get; set; }
public Type PluginType { get; set; }
public PluginAttribute(IPluginAttributeView view)
{
PluginName = view.PluginName;
PluginConfigurationName = view.PluginConfigurationName;
PluginCategory = view.PluginCategory;
PluginType = view.PluginType;
}
}
public interface IMagic1
{
void DoMagic1();
}
public interface IMagic2
{
void DoMagic2();
}
[PluginAttribute1("PluginName1", "PluginConfig1.json", "Magic1", typeof(IMagic1))]
[PluginAttribute2("PluginName2", "PluginConfig2.json", "Magic2", typeof(IMagic2))]
public class DoSomeMagic : IMagic1, IMagic2
{
public void DoMagic1()
{
}
public void DoMagic2()
{
}
}
【问题讨论】:
-
编辑我包含了一个引发相关错误的完整代码示例。
-
当你说要按接口类型查询时,是按导出部分的接口类型查询,还是按附加元数据的接口类型查询?
-
@Matt,使用上面的代码,我希望能够在
import1中仅检索那些包含匹配类型属性的属性的元数据,例如,我想进入import1 元数据集合,其中PluginType属性的类型为IMagic1。
标签: c# dependency-injection inversion-of-control metadata mef