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

C#多个自定义控件类型识别,c#,C#,我的问题是基于WPF的一个例子,但我认为,它更多地是关于C#的 假设我有一个WPF应用程序,其中我使用了几种类型的自定义控件,让它成为CustControl1,CustControl2,CustControl3。页面可以动态加载XAML,其中包含两种类型的控件。 这个页面背后有一个代码,其中一些操作是通过自定义控件进行的,例如: List<CustControl1> MyCustControls = this.Descendents().OfType<CustControl1&

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

假设我有一个WPF应用程序,其中我使用了几种类型的自定义控件,让它成为
CustControl1
CustControl2
CustControl3
。页面可以动态加载XAML,其中包含两种类型的控件。
这个页面背后有一个代码,其中一些操作是通过自定义控件进行的,例如:

List<CustControl1> MyCustControls = this.Descendents().OfType<CustControl1>().ToList();          
foreach (CustControl1 cntr in MyCustControls)
{
   ...
List MyCustControls=this.degents().OfType().ToList();
foreach(MyCustControls中的CustControl1 cntr)
{
...
在上述代码中,明确定义了
CustControl1
类型,如果页面上加载了其他类型的自定义控件(属于
CustControl2
CustControl3
类型),代码将无法识别它

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

你可以这样做

var controls = this.Descendents().OfType<CustControl1>().Cast<Control>()
                   .Union(this.Descendents().OfType<CustControl2>().Cast<Control>())
                   .Union(this.Descendents().OfType<CustControl3>().Cast<Control>())
                   .ToList();
var controls=this.degents().OfType().Cast())
.Union(this.degents().OfType().Cast())
.Union(this.degents().OfType().Cast())
.ToList();
您可以这样做

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

如果我正确理解了您的问题,这是一个基本的OOP概念

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

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

List<UserControl> MyCustControls = this.Descendents().OfType<UserControl>().ToList();          
foreach (UserControl cntr in MyCustControls)
{
   cntr.SomeShareMethod()
List MyCustControls=this.degents().OfType().ToList();
foreach(MyCustControls中的UserControl cntr)
{
cntr.SomeShareMethod()
或者,如果您需要在具体实现中显式调用它,您可以这样做:

List<Control> MyCustControls = this.Descendents().OfType<Control>().ToList();          
foreach (Control cntr in MyCustControls)
{
   if (cntr is CustControl1) 
       ((CustControl1)cntr).SomeSpecificMethod()
List MyCustControls=this.degents().OfType().ToList();
foreach(MyCustControls中的控制cntr)
{
如果(cntr为CustControl1)
((CustControl1)cntr.SomeSpecificMethod()

如果我正确理解了您的问题,这是一个基本的OOP概念

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

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

List<UserControl> MyCustControls = this.Descendents().OfType<UserControl>().ToList();          
foreach (UserControl cntr in MyCustControls)
{
   cntr.SomeShareMethod()
List MyCustControls=this.degents().OfType().ToList();
foreach(MyCustControls中的UserControl cntr)
{
cntr.SomeShareMethod()
或者,如果您需要在具体实现中显式调用它,您可以这样做:

List<Control> MyCustControls = this.Descendents().OfType<Control>().ToList();          
foreach (Control cntr in MyCustControls)
{
   if (cntr is CustControl1) 
       ((CustControl1)cntr).SomeSpecificMethod()
List MyCustControls=this.degents().OfType().ToList();
foreach(MyCustControls中的控制cntr)
{
如果(cntr为CustControl1)
((CustControl1)cntr.SomeSpecificMethod()

视情况而定。你想做什么?我想使用不同类型的自定义控件而不必每次重构和重新编译项目。这取决于情况。你想做什么?我想使用不同类型的自定义控件而不必每次重构和重新编译项目。