C#多个自定义控件类型识别

时间:2011-06-07 14:23:00

标签: c#

我的问题是基于WPF的一个例子,但我认为,它更多的是关于C#。

假设我有一个WPF应用,其中我使用了几种类型的自定义控件,让它为CustControl1CustControl2CustControl3。该页面可以使用任一类型的控件动态加载XAML 这个页面有一个代码隐藏,可以使用自定义控件进行一些操作,例如:

List<CustControl1> MyCustControls = this.Descendents().OfType<CustControl1>().ToList();          
foreach (CustControl1 cntr in MyCustControls)
{
   ...

在上面的代码中,显式定义了CustControl1类型,如果页面上加载了其他类型的自定义控件(CustControl2CustControl3类型),则代码不会认识到它。

我的C#知识水平不足以找出如何解决这种多类型识别问题。或者在C#中是否可能?

2 个答案:

答案 0 :(得分:2)

如果我理解你的问题,这是一个基本的OOP概念。

您可以将所有控件作为父类传递(UserControl,甚至是Control),或者它们都实现的接口(例如IControl)

然后,如果您尝试调用的方法存在于父级中,则可以调用它:

List<UserControl> MyCustControls = this.Descendents().OfType<UserControl>().ToList();          
foreach (UserControl cntr in MyCustControls)
{
   cntr.SomeShareMethod()

或者,如果您需要在具体实现上明确调用它,您可以这样做:

List<Control> MyCustControls = this.Descendents().OfType<Control>().ToList();          
foreach (Control cntr in MyCustControls)
{
   if (cntr is CustControl1) 
       ((CustControl1)cntr).SomeSpecificMethod()

答案 1 :(得分:1)

你可以做到

var controls = this.Descendents().OfType<CustControl1>().Cast<Control>()
                   .Union(this.Descendents().OfType<CustControl2>().Cast<Control>())
                   .Union(this.Descendents().OfType<CustControl3>().Cast<Control>())
                   .ToList();