Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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#_.net_Vb.net_Winforms - Fatal编程技术网

C# 传递客户端可能会失效的对象的首选技术

C# 传递客户端可能会失效的对象的首选技术,c#,.net,vb.net,winforms,C#,.net,Vb.net,Winforms,我采用了一种技术,将现有对象传递给表单,这样表单就可以显示对象的内容,并允许用户在必要时对其进行修改。表单没有绑定到对象,因此当需要执行操作时,表单会清理其控件的内容并将其放入对象中。然后验证对象,并向用户报告任何问题。如果对象有效,则可以将其返回给调用者,以便调用者可以刷新视图/列表/等 到目前为止,一切顺利。但是,如果表单的内容或缺少创建了一个无效对象,而用户没有更正它,则可能会取消表单,表单可能会将一个无效对象交还给调用方。这不好 从本质上说,我正在寻找一种优雅而高效的方法,要么让对象保持

我采用了一种技术,将现有对象传递给表单,这样表单就可以显示对象的内容,并允许用户在必要时对其进行修改。表单没有绑定到对象,因此当需要执行操作时,表单会清理其控件的内容并将其放入对象中。然后验证对象,并向用户报告任何问题。如果对象有效,则可以将其返回给调用者,以便调用者可以刷新视图/列表/等

到目前为止,一切顺利。但是,如果表单的内容或缺少创建了一个无效对象,而用户没有更正它,则可能会取消表单,表单可能会将一个无效对象交还给调用方。这不好

从本质上说,我正在寻找一种优雅而高效的方法,要么让对象保持原样,要么在用户取消表单/动作时回滚


我考虑了一系列的技术,每种技术都有许多优点和缺点。我很想考虑其他观点。

< P>我的方法一直是:

验证整个ViewModel。如果验证了,则提交更改。如果无法验证:

  • 对于表单中有效的条目,请将其保留为用户输入的条目
  • 对于表单中无效的条目,如果它与正确的格式匹配(例如,它是一个生日字段,但用户输入的日期是1788年),则返回该值,但将其标记为无效
  • 对于表单中无效的条目,如果它与正确的格式不匹配(例如,它是一个年龄字段,但用户输入了X),则不返回任何值(使其为空)并将其标记为无效

希望这对你能做的事情有所帮助

  • IsValid()
    方法添加到对象中,当表单关闭时,检查包含对象的有效性

  • 在表单中添加一些
    state
    属性,该属性变为(假设它是
    boolean
    false
    ,当表单关闭时,您可以检查该表单的状态


只是一些例子

在过去,我通过在将对象传递给表单时制作对象的浅拷贝来解决这个问题。然后,当副本返回时,您验证它。如果它签出,您只需用副本覆盖原始对象

  private static void PassTheObj()
  {
     MethodThatAcceptsObj(realObject.Copy());  
  }

  private static void ValidateObj(customObject objCopy)
  {
     if (objCopy.IsValid()) realObject = objCopy;
  }

这是我考虑过的一个好主意。然而,我不得不为具有大量属性的浅层对象编写副本,并且可能会更深入地进行聚合,这让我感到很不快。我只是在偷懒吗?@DavidOsborne哈哈,我不会从偷懒的角度来判断我不知道这是正确的还是最优雅的方式,这只是我的方式。您的自定义对象是否有自己的方法等。?如果不是,结构可能是一个可行的解决方案——但我承认,我对结构的经验是有限的。这两个都是可行的,谢谢你的想法。但是,由于对象是通过引用传递的,因此表单可以更改对象,使其无效。这似乎(闻起来?)对我来说是错误的,因此我提出了问题。因为这可能是解决方案,或者克隆对象并在传递到窗体(如果对象较小)或对象较大时,创建一个轻量级的特殊窗体对象并传递该对象。您是否尝试序列化然后反序列化对象以获得该对象的副本?