gpt4 book ai didi

c# - 具有 AllowMultiple=true 的自定义 MEF ExportAttribute 导致重复

转载 作者:太空狗 更新时间:2023-10-30 00:25:22 24 4
gpt4 key购买 nike

我想导出具有多个元数据选项的 Foo 类型:

public interface IFoo
{
void Do ();
}

[ExportFoo ("Bar", "1.0")]
[ExportFoo ("Baz", "1.0")]
[ExportFoo ("Baz", "2.0")]
public class Foo : IFoo
{
public void Do () {}
}

我用这种方式声明了 ExportFooAttribute:

public interface IFooMeta
{
string Name { get; }
string Version { get; }
}

[MetadataAttribute, AttributeUsage (AttributeTargets.Class, AllowMultiple = true)]
public class ExportFooAttribute : ExportAttribute, IFooMeta
{
public string Name { get; private set; }
public string Version { get; private set; }

public ExportFooAttribute (string name, string version) : base(typeof(IFoo))
{
Name = name;
Version = version;
}
}

根据文档,当 AllowMultiple 设置为 true 时,元数据实际上包含原始元数据的属性数组,因此我以这种方式导入类型:

public interface IFooMultiMeta
{
string[] Name { get; }
string[] Version { get; }
}

public class Program
{
[ImportMany]
public List<Lazy<IFoo, IFooMultiMeta>> Foos { get; set; }

private static void Main ()
{
new Program().MainInternal();
}

private void MainInternal ()
{
new CompositionContainer(new AssemblyCatalog(Assembly.GetExecutingAssembly())).ComposeParts(this);
foreach (Lazy<IFoo, IFooMultiMeta> lazyFoo in Foos)
for (int i = 0; i < lazyFoo.Metadata.Name.Length; i++)
Console.WriteLine("* {0} {1}", lazyFoo.Metadata.Name[i], lazyFoo.Metadata.Version[i]);
Console.WriteLine(Equals(Foos[0].Metadata, Foos[1].Metadata));
Console.ReadKey();
}
}

我希望获得一个 Foo 实例,其元数据包含 3 个值的数组。但是,我得到了这个:

* Baz 2.0
* Baz 1.0
* Bar 1.0
* Baz 2.0
* Baz 1.0
* Bar 1.0
* Baz 2.0
* Baz 1.0
* Bar 1.0
False

更糟糕的是,元数据实例不同,所以我什至无法正确过滤掉重复项。

问题:如何正确导出一个类以满足元数据属性的多种组合?

完整示例:http://pastebin.com/WyjN95gr

最佳答案

三个导出的原因是您从 ExportAttribute 派生自定义导出元数据。这意味着对于每个装饰,都会发生不同的导出。三个装饰导致三个导出。

我不确定为什么每次导出都会得到所有 {Name,Version} 对。

要克服这三个导出问题,您可以更新您的自定义属性以改为从 Attribute 派生:

[MetadataAttribute, AttributeUsage (AttributeTargets.Class, AllowMultiple = true)]
public class ExportMetaFooAttribute : Attribute, IFooMeta
{
public string Name { get; private set; }
public string Version { get; private set; }

public ExportFooAttribute (string name, string version)
{
Name = name;
Version = version;
}
}

我已将其重命名为 ExportMetaFooAttribute,因为它不是导出属性而是导出元数据属性。

然后将 Foo 类更改为:

[Export(typeof(IFoo))]
[ExportMetaFoo("Bar", "1.0")]
[ExportMetaFoo("Baz", "1.0")]
[ExportMetaFoo("Baz", "2.0")]
public class Foo : IFoo
{
public void Do ()
{}
}

如您所见,我们现在需要额外的 ExportAttribute 来指定需要导出此类。

关于c# - 具有 AllowMultiple=true 的自定义 MEF ExportAttribute 导致重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17458304/

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