1

私にはUserControlいくつかの子がUserControlあり、それらUserControlには子UserControlがあります。

このことを考慮:

MainUserControl
  TabControl
    TabItem
      UserControl
        UserControl
          UserControl : ISomeInterface
    TabItem
      UserControl
        UserControl
          UserControl : ISomeInterface
    TabItem
      UserControl
        UserControl
          UserControl : ISomeInterface
    TabItem
      UserControl
        UserControl
          UserControl : ISomeInterface

これは私がこれまでに持っているものですが、見つかりませんISomeInterface:

PropertyInfo[] properties = MainUserControl.GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
    if (typeof(ISomeInterface).IsAssignableFrom(property.PropertyType))
    {
        property.GetType().InvokeMember("SomeMethod", BindingFlags.InvokeMethod, null, null, null);
    }
}

その実装UserControlからのすべての子をリフレクションを介して見つけ、そのインターフェースでmethod( ) を呼び出すことは可能ですか?MainUserControlISomeInterfacevoid SomeMethod()

4

2 に答える 2

5

MainUserControl 内のすべてのサブコントロールを再帰的に繰り返す必要があります。

使用できるヘルパー メソッドを次に示します。

/// <summary>
/// Recursively lists all controls under a specified parent control.
/// Child controls are listed before their parents.
/// </summary>
/// <param name="parent">The control for which all child controls are returned</param>
/// <returns>Returns a sequence of all controls on the control or any of its children.</returns>

public static IEnumerable<Control> AllControls(Control parent)
{
    if (parent == null)
    {
        throw new ArgumentNullException("parent");
    }

    foreach (Control control in parent.Controls)
    {
        foreach (Control child in AllControls(control))
        {
            yield return child;
        }

        yield return control;
    }
}

それで:

foreach (var control in AllControls(MainUserControl))
{
    PropertyInfo[] properties = control.GetType().GetProperties();
    ... Your loop iterating over properties

または(はるかに簡単なので、これが機能する場合ははるかに優れています):

foreach (var control in AllControls(MainUserControl))
{
    var someInterface = control as ISomeInterface;

    if (someInterface != null)
    {
        someInterface.SomeMethod();
    }
}

または、Linq を使用して (using System.Linqこれを行う必要があります):

foreach (var control in AllControls(MainUserControl).OfType<ISomeInterface>())
    control.SomeMethod();

何よりも良いようです。:)

于 2013-04-01T10:07:02.483 に答える
3

多分私は自分で間違った方向を見ています。マシューズの回答に対するコメントの意味は次のとおりです。

 foreach (var control in AllControls(MainUserControl))
 {
     if (control is ISomeInterface)
     {

     }
 }

また

 foreach (var control in AllControls(MainUserControl))
 {
     var someInterface = control as ISomeInterface;
     if (someInterface != null)
     {
          someInterface.SomeMethod();
     }
 }
于 2013-04-01T10:15:29.547 に答える