从UserControl到自定义控件的无效转换

时间:2011-02-27 14:56:10

标签: c# user-controls casting

我有几个控件都继承自UserControl,我有MergeSort方法在UserControl类型上运行(以免我写出6种不同的方法),但是当我在排序后转回我的自定义控件,它会抛出一个错误,我做错了什么? mergesort方法需要Left属性,每个自定义控件都使用该属性,那么还有其他方法吗?

MergeSort方法如下所示:

public UserControl[] MergeSort(UserControl[] array)

演员看起来像:

(CustomControl[])MergeSort(customControlArray);

2 个答案:

答案 0 :(得分:2)

(我删除了之前的答案,因为我认为这实际上是错误的。)

听起来你需要在你的控件和UserControl之间进行抽象,它代表了常见的功能。有两种主要方法可以实现这一点,无论您使用哪种方法,都是个人编码偏好,您计划如何进一步扩展,如何在项目中组织代码等等......

  1. 从基类继承。基本上,创建一个MyCustomControl(或任何你想要命名的)类,它实现了自定义控件之间的通用功能。这将继承自UserControl,您的控件将从此继承。然后你的方法会期望/返回这个基类的数组。
  2. 实施界面。您可以创建一个ICustomControl(或任何您想要命名的界面)界面,它代表您的自定义控件之间的常见功能。然后,您的控件将继承UserControl并实施ICustomControl。然后你的方法会期望/返回这个接口类型的数组。
  3. 我个人更喜欢界面方法。在许多人的面向对象的代码中,继承往往被过度使用,而且实际上不应该如此。接口更好地将抽象(或代码契约)表示为类型(而不是类)。但这是另一次更大的讨论辩论,我想:)

答案 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();

: - )