Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#对象编辑和序列化初始化_C#_Serialization_Reflection - Fatal编程技术网

C#对象编辑和序列化初始化

C#对象编辑和序列化初始化,c#,serialization,reflection,C#,Serialization,Reflection,我在如何分离属性值及其访问器方面遇到了一些问题。我有一些封装在课堂上的电子仪器。有些封装了一个DLL,该DLL由制造商提供,用于处理通信 一个简单的例子: 公共类仪器 { 私人制造的小型仪器; 公共文书() { _仪表=新制造商或所有仪表; } 公共浮动设置 { 得到 { 返回仪器设置; } 设置 { _instrument.SomeSetting=值; } } } 连接后,我可以使用propertygrid编辑属性。我希望使用序列化不仅可以将设置保存/还原到文件,还可以在设备脱机时编辑设置。

我在如何分离属性值及其访问器方面遇到了一些问题。我有一些封装在课堂上的电子仪器。有些封装了一个DLL,该DLL由制造商提供,用于处理通信

一个简单的例子:

公共类仪器
{
私人制造的小型仪器;
公共文书()
{
_仪表=新制造商或所有仪表;
}
公共浮动设置
{
得到
{
返回仪器设置;
}
设置
{
_instrument.SomeSetting=值;
}
}
}
连接后,我可以使用propertygrid编辑属性。我希望使用序列化不仅可以将设置保存/还原到文件,还可以在设备脱机时编辑设置。使用上述实现,如果设备未连接,将引发异常。我可以添加私有字段作为中间人和if语句来检查连接状态。但我有很多房产,希望有更好的方式


有没有一种简单的方法来构造对象的“抽象”版本?我基本上想要一个克隆,但用私有字段替换原始访问器逻辑。我知道我可以使用GetMembers,但是从那以后该怎么办呢?

如果是我,我会将这两件事分开,特别是a:我的数据表示(用于序列化和大多数操作)和b:制造商表示。您的需求几乎迫使您沿着这条路线前进。然后,我将添加一个
ApplyTo(Instrument)
方法,该方法可能使用序列化在名称对名称的基础上应用这些值。我认为这将为您节省很多痛苦,特别是如果您将您的属性缩写为:

public float SomeSetting {get;set;}

这将允许您在脱机时完全使用自己的模型。欺骗ManFactorys模型听起来不太可能,尤其是在与序列化混合使用时。

您有几种可能性,因此您必须根据您的具体情况做出决定,这似乎是最可行的

分开: 在Marc Gravell的回答中,您可以将您的模型与制造商的模型完全分离,并使用外部解析器,通过执行特定调用来处理所需的事务。只有当您无法想象在原始DLL之上使用抽象层时,我才会使用这种方法

装饰师: 由于要向给定库添加行为(检查连接),首先想到的是使用。这基本上可以归结为你最初的暗示;包装整个DLL并在必要时实现额外的中间逻辑。由于您是手动编写decorator的,因此可以对API进行大量更改,以使其满足您的需要

代理: 根据您想要实现的中间逻辑的变化,可以考虑使用。例如,当您只想公开原始属性,并为每个属性添加相同的额外行为时。当制造商的
仪器
类实现接口时,您可以生成一个在运行时实现此接口的类,并将调用重定向到制造商的实际DLL。这并不容易,但有几个库可以帮助您做到这一点,或者更低级。当你能从中获益时,只考虑走这条路。例如,当你需要包装一个大的库,或者一个经常随时间变化的库时

当你所要做的就是包装20个属性时,我建议你选择decorator方法。当您有一些空闲时间时,在运行时代码生成和尝试生成代理方面可能仍然很有趣


我可以给你使用RunSharp创建的,只是让你感觉一下它是否是你想要尝试的东西。
CreateGenericInterfaceWrapper()
函数,在需要时生成强制转换。

工具
是否实现任何接口?如果有,你可以试着生成一个代理。史蒂文,是的。制造商提供的组件有我实际使用的接口,但我没有意识到这是这个问题的重要信息。为什么它必须实现一个接口?我不熟悉代理模式,但乍一看就像我说的“抽象”版本。我可以使用reflection.emit在运行时生成代理,还是需要手动生成代理?理论上,您可以在运行时生成代理,但这是非常高级的东西。我会发布一个答案,这可能会让你开始。谢谢史蒂文。我回顾了我的包装器类并引用了我的设计模式书。它确实是一个装饰家。我计划修改装饰器以满足第一批关键仪器的要求。希望到时候我能弄清楚动态代理是否值得花时间。我有大约20件乐器要制作,所以我猜装饰师会坚持下去。