gpt4 book ai didi

c# - MEF 更新导出的部件元数据(元数据 View 无效,因为属性具有属性设置方法)

转载 作者:行者123 更新时间:2023-11-30 22:15:24 25 4
gpt4 key购买 nike

我有一个应用程序,我正在使用 MEF 来编写它。我想知道是否可以在导入零件后更新零件的元数据信息。

这样做的原因如下:我在 ListBox 中显示导入部件的名称和 typeof(int) 属性,并且在选择相应的 ListBoxItem 之前不会加载它们(非常标准)。现在我想在某个事件发生时更新一个部件的元数据信息,因此列表框中显示的信息类似于“[部件名称]([新编号])”。

我将元数据导入为定义它的信息的接口(interface),但是当我将 int 属性设置为可编辑时(使用设置的访问器),我在组合时收到以下执行:

"The  MetadataView 'myMetadataInterface' is invalid 
because property 'myInt' has a property set method."

有什么办法可以实现吗?或者元数据是否始终只在零件创建后才读取?

我知道这个问题看起来很奇怪,但这并没有降低它的难度,因此也很有趣;-)


编辑(基于 Lee 的回答,以使人们成为问题的核心)

我只想知道是否可以在部件组成之后但在实际加载之前更新元数据属性 (HasValue == false)。不用担心过滤或找到零件。

我在导出接口(interface)中添加了一个属性,这个属性只是在UI中表示和更新,这个属性没有其他功能,部分不被它过滤。

谢谢

最佳答案

Metadata filtering and DefaultValueAttribute

When you specifiy a metadata view, an implicit filtering will occur to match only those exports which contain the metadata properties defined in the view. You can specify on the metadata view that a property is not required, by using the System.ComponentModel.DefaultValueAttribute. Below you can see where we have specified a default value of false on IsSecure. This means if a part exports IMessageSender, but does not supply IsSecure metadata, then it will still be matched.

citation

简短版(在问题编辑后编辑)。

您永远不需要在运行时更新元数据。如果您有一些应该更新的数据并且属于 mef 部分,您需要选择是通过重新编译来更新它,还是将该数据存储在 dll 之外的灵活存储中。如果不重新编译,就无法存储您在 dll 中所做的更改,因此这是一个有缺陷的设计。

上一篇文章。

更改 View 上的值会隐藏加载的组件。当然,元数据只是返回初始化值的对象的接口(interface);确保您可以在技术上更新这些值,但这不是元数据的目的。

您不会更改 Type 实例的 Name 字段。为什么不?因为它是元数据。在运行时更新元数据意味着真实数据实例的性质以某种方式被修改。

如果可能,这行代码不会引入 Triple 类型。

typeof(Double).Name = "Triple";
var IGotATriple = new Triple();

如果你想改变值,你只需要用那个信息创建另一个对象并绑定(bind)到那个对象上。元数据是编译进去的。如果你在加载部件后更改它,它不会更改部件源中的任何内容,所以你是在撒谎。 (除非您要访问源代码并在那里更改它并重新编译)。

让我们看一个例子:

[Export(typeof(IPart))]
[ExportMetadata("Part Name","Gearbox")]
[ExportMetadata("Part Number","123")]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class GearBoxPart : Part { public double GearRatio ... }

现在,让我们假设您有一个显示可用部件及其编号的 UI。现在,制造商出于某种原因更改了零件号,而您想要更新它。如果可能,您可能需要考虑将部件号存储在 list 或数据库中。或者,每次部件号更改时您都必须重新编译。

可以重新编译。您有一个执行上述操作的 Controller UI,但您没有更新元数据,而是提交了重建部件代码文件的请求。该请求将通过解析代码文件、替换部件号、然后发送批处理重新编译和重新分发新的 dll 来处理。在我看来,这是白费力气的大量工作。

因此,您设置了一个数据库。然后将对象元数据更改为此。

[ExportMetadata("OurCompanyNamePartNumber","123")]

然后您有一个数据库/ list /xml,它将您公司设计的唯一永久静态零件号映射到当前零件号。控制 UI 中的修改会更新数据库/ list /xml。

<PartMap>
<PartMapEntry OurCompanyNamePartNumber="123" ManufacturerPartNumber="456"/>
...
</PartMap>

然后最终用户 UI 按制造商部件号查找部件,mef 代码在 PartMap 中查找以获取 mef 部件号。

关于c# - MEF 更新导出的部件元数据(元数据 View 无效,因为属性具有属性设置方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17977617/

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