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哈哈,我不会从偷懒的角度来判断我不知道这是正确的还是最优雅的方式,这只是我的方式。您的自定义对象是否有自己的方法等。?如果不是,结构可能是一个可行的解决方案——但我承认,我对结构的经验是有限的。这两个都是可行的,谢谢你的想法。但是,由于对象是通过引用传递的,因此表单可以更改对象,使其无效。这似乎(闻起来?)对我来说是错误的,因此我提出了问题。因为这可能是解决方案,或者克隆对象并在传递到窗体(如果对象较小)或对象较大时,创建一个轻量级的特殊窗体对象并传递该对象。您是否尝试序列化然后反序列化对象以获得该对象的副本?