我有几个控件都继承自UserControl
,我有MergeSort
方法在UserControl
类型上运行(以免我写出6种不同的方法),但是当我在排序后转回我的自定义控件,它会抛出一个错误,我做错了什么? mergesort方法需要Left
属性,每个自定义控件都使用该属性,那么还有其他方法吗?
MergeSort方法如下所示:
public UserControl[] MergeSort(UserControl[] array)
演员看起来像:
(CustomControl[])MergeSort(customControlArray);
答案 0 :(得分:2)
(我删除了之前的答案,因为我认为这实际上是错误的。)
听起来你需要在你的控件和UserControl
之间进行抽象,它代表了常见的功能。有两种主要方法可以实现这一点,无论您使用哪种方法,都是个人编码偏好,您计划如何进一步扩展,如何在项目中组织代码等等......
MyCustomControl
(或任何你想要命名的)类,它实现了自定义控件之间的通用功能。这将继承自UserControl
,您的控件将从此继承。然后你的方法会期望/返回这个基类的数组。ICustomControl
(或任何您想要命名的界面)界面,它代表您的自定义控件之间的常见功能。然后,您的控件将继承UserControl
并实施ICustomControl
。然后你的方法会期望/返回这个接口类型的数组。我个人更喜欢界面方法。在许多人的面向对象的代码中,继承往往被过度使用,而且实际上不应该如此。接口更好地将抽象(或代码契约)表示为类型(而不是类)。但这是另一次更大的讨论辩论,我想:)
答案 1 :(得分:2)
我认为你必须手动投射每一个:
CustomControl[] customControlArray;
...
UserControl[] sortedControls = MergeSort(customControlArray);
CustomControl[] sortedCustomControls = Array.ConvertAll<UserControl, CustomControl>(sortedControls, delegate(UserControl control)
{
return (CustomControl)control;
});
如果您拥有.NET 3.5+,则可以使用更多“更酷”的语法。 :)
编辑:更酷的语法是:
UserControl[] sortedControls = customControlArray.ToList().ConvertAll(c => (CustomControl)c).ToArray();
: - )