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

本文关键字:类型 识别 自定义控件 | 更新日期: 2023-09-27 17:58:30

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

假设我有一个WPF应用程序,其中我使用了几种类型的自定义控件,让它成为CustControl1CustControl2CustControl3。该页可以动态加载带有这两种类型的控件之一的XAML
这个页面后面有一个代码,其中一些操作是用自定义控件进行的,比如:

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

在上面的代码中,CustControl1类型被明确定义,如果页面上加载了其他类型的自定义控件(CustControl2CustControl3类型),代码将无法识别它

我的C#知识水平不足以解决这样一个多类型识别的问题。或者它在C#中是可能的?

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

如果我正确理解你的问题,这是一个基本的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()

您可以进行

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