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

3
我有几个控件都继承自UserControl,并且我有一个MergeSort方法在UserControl类型上运行(这样可以避免我编写6种不同的方法),但是当我在排序后向我的自定义控件强制转换时,它会抛出错误,我做错了什么?合并排序方法需要Left属性,每个自定义控件都使用它,那么我还有其他方法可以做到这一点吗?
合并排序方法如下:
public UserControl[] MergeSort(UserControl[] array)

Cast的样子如下:

(CustomControl[])MergeSort(customControlArray);
2个回答

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

:-)


这个方法可行,结合使用基类而不是用户控件。 - TimCodes.NET
感谢 @Chi,看一下我的编辑,使用 .NET 3.5 的新功能语法。 :) - Shadow The Spring Wizard

2

看起来你需要在控件和代表通用功能的UserControl之间建立抽象层。有两种主要的实现方式,哪种方式使用取决于个人编码偏好、你计划如何进一步扩展这些内容、以及如何在项目中组织代码等等。

  1. 继承一个基类。基本上,创建一个实现自定义控件之间共同功能的MyCustomControl(或者其他你想要命名的)类。这将从UserControl继承,而你的控件将从此继承。然后,你的方法将期望/返回这个基类的数组。
  2. 实现一个接口。你可以创建一个代表自定义控件之间共同功能的ICustomControl(或者其他你想要命名的)接口。然后,你的控件将从UserControl继承并实现ICustomControl。然后,你的方法将期望/返回这个接口类型的数组。

我个人更喜欢接口方法。继承在很多人的面向对象代码中被过度使用,并且实际上不应该这样。接口更好地表示了作为类型的抽象(或代码契约),而不是类。但我想这是另一个时间里更大的讨论争议。


谢谢,David。我会尝试使用接口方法。 - TimCodes.NET

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接