C# NET中的强类型控件

C# NET中的强类型控件,c#,.net,winforms,generics,C#,.net,Winforms,Generics,我在Windows窗体应用程序上工作了很长一段时间,我真的发现自己在GUI代码中做的类型转换比在底层业务代码中做的要多 如果您看到ComboBox控件接受一些模糊的“对象”作为它的项,我的意思就会变得很明显。 然后,您可以显示一些DisplayMember和ValueMember等 如果我想稍后检索该值,我需要将对象类型转换回原来的状态。与字符串一样,获取值需要 string value = (string)combobox1.SelectedItem; 由于框架中有泛型已经有相当一段时间了,

我在Windows窗体应用程序上工作了很长一段时间,我真的发现自己在GUI代码中做的类型转换比在底层业务代码中做的要多

如果您看到ComboBox控件接受一些模糊的“对象”作为它的项,我的意思就会变得很明显。 然后,您可以显示一些DisplayMember和ValueMember等

如果我想稍后检索该值,我需要将对象类型转换回原来的状态。与字符串一样,获取值需要

string value = (string)combobox1.SelectedItem;
由于框架中有泛型已经有相当一段时间了,我仍然想知道为什么标准工具箱中没有一个控件是泛型的

我还发现自己一直在使用ListViewItems上的.Tag属性来保留显示的域对象。但每次我需要访问该对象时,我都需要另一个类型转换

为什么我不能用ListViewItem类型的项目创建组合框或ListView


我是在这里遗漏了什么,还是这仅仅是另一个没有很好地考虑控制的例子?

我不认为你遗漏了什么。
只是这些类是在泛型出现之前创建的,WinForms不够先进,MS无法花大量时间更改或扩展API。

我经常为控件创建包装类。这允许我使用泛型。这通常与反射结合在一起,反射在编译时不是类型安全的,但在运行时可能是类型安全的。

虽然“没有使用泛型”的批评不能公平地应用于在控件存在之前开发的控件。。。人们一定想知道WPF控件(在.NET3.0中是新的,在.NET2.0中是泛型之后)

我在中检查了该方法。它接受一个对象参数(ugh)

此控件主要通过XAML使用。这样做是因为无法在XAML中指定类型参数吗?(顺便说一句,没有办法在XAML中指定类型参数吗?)


很抱歉,没有明确的“为什么”答案,只是分享了在使用UI时需要强制转换的常见痛苦。

我认为,这个问题的一个常见根源不是将视图/表示逻辑与内存中的数据模型逻辑分离。不幸的是,这是WinForms和VisualStudioGUI设计器共同参与的一个架构错误

WinForms和VS designer不鼓励程序员将其数据对象的管理与表单类本身分开。如果ComboBox ListViewItem对象不通过泛型或对象集合提供对任意对象的任何支持,可能会更好

除非您正在拼凑一些使用和寿命有限的东西,否则您应该尽量避免在控件或窗体中存储对单个数据对象的引用。它们应该单独管理,如果需要引用,应该通过为您正在使用的特定类型的视图类设计的模型管理类来完成

不过,解决这个问题的一个简单方法可能是使用表单类上的Dictionary字段成员将放入组合框或ListView的文本表示“映射”到原始对象。这不是一个理想的解决方案,但它至少在数据和UI控件之间提供了半个间接步骤,这可以使代码更易于维护


编辑:这与公开对象实例的ListViewItemCollection类是分开的。。。官方的辩护很可能是他们想要支持标准的IEnumerable和ICollection接口。但是他们没有理由不提供这些方法的特定类型重写,因为它是显式地设计来存储ListViewItem实例的。所以在这个问题上我没有答案。

好吧,如果您将控件数据绑定到数据绑定源,您就可以通过这种方式获取数据,但这仍然不是强类型的。如果要显示单个业务对象的多个参数/方面,则可以绑定到该参数/方面,然后访问(强类型)成员——当然,这一切都可以追溯到Turbury Intelligent的答案,即更好地分离模型和视图。尽管如此,我还是同意基于泛型的键入会有所帮助。

这是可能的(如果您愿意,您可以创建自己的泛型控件),但是如果您这样做,Visual Studio附带的表单设计器将崩溃。你必须在没有它的情况下做事

你不是第一个想到这一点的人,微软已经收到了公众对此的批评。让我们希望他们在将来增加对这方面的支持