2011-02-27 62 views
3

我有几个控制,所有从UserControl继承,而我有上UserControl类型(救我从编写出6点不同的方法)运行的MergeSort方法,但是当我投回到我排序后的自定义控件,它会抛出一个错误,我做错了什么? mergesort方法需要每个自定义控件使用的Left属性,那么是否有其他方式可以执行此操作?无效转换到自定义控件

归并方法是这样的:

public UserControl[] MergeSort(UserControl[] array) 

演员的样子:(我删除了我以前的答案,因为我认为这实际上是不正确的)

(CustomControl[])MergeSort(customControlArray); 

回答

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

:-)

+0

这工作,结合使用基类而不是usercontrol – 2011-02-27 16:23:25

+0

顺便说一句,你是什么意思'冷却器'语法? – 2011-02-27 16:28:36

+0

Cheers @Chi请参阅我编辑的使用.NET 3.5新功能的语法。 :) – 2011-02-28 09:23:02

2

这听起来像你需要在控件和代表通用功能的UserControl之间进行抽象。有做到这一点主要有两种方式,和哪一个您使用的是个人的喜好编码的问题,你打算如何进一步扩大了这些,你如何组织你的代码的项目,等...

  1. 继承来自基类。基本上,创建一个MyCustomControl(或任何你想命名它的类),它实现你的自定义控件之间的通用功能。这将从UserControl继承,您的控件将从此继承。然后你的方法会期望/返回这个基类的一个数组。
  2. 实现一个接口。你可以创建一个ICustomControl(或任何你想命名它的)接口,它代表你的自定义控件之间的通用功能。然后,您的控件将继承UserControl以及执行ICustomControl。然后你的方法会期望/返回这个接口类型的数组。

我个人比较喜欢接口方法。在许多人的面向对象代码中,继承往往被滥用,实际上不应该这样做。一个接口更好地将抽象(或代码契约)表示为类型(而不是类)。但是,这是另一次的更大的讨论辩论,我想:)

+0

感谢的是,大卫,我会努力的接口方法 – 2011-02-27 15:33:43

+0

我都尝试,他们还是给了同样的错误 – 2011-02-27 16:20:16