0

List<T>次のような子コントロールを 返すメソッドがあります。

void GetAllControlsOfType<T>(List<T> lst, Control parent) where T:class
{
    if (parent.GetType() == typeof(T))
        lst.Add(parent as T);

    foreach (Control ch in parent.Controls)
        this.GetAllControlsOfType<T>(lst, ch);
}

しかし、私は次のように使用する必要があります。

List<WebControl> foo = new List<WebControl>();
GetAllControlsOfType<WebControl>(foo, this); //this = webpage instance

確かに、次のように呼び出すことができるメソッドを作成できる c# マジックがいくつかあります。

List<WebControl> foo = GetAllControlsOfType<WebControl>(this);
4

1 に答える 1

2

List<T>「魔法」は、ではなくを返す別のメソッドを宣言するだけvoidです。

List<T> GetAllControlsOfType<T>(Control parent) where T : class {
    List<T> list = new List<T>();
    GetAllControlsoFType<T>(list, parent);   // Invoke your existing method
    return list;
}

再帰を使用しているため、既存のメソッドを単純に returnに変更することはできません。List<T>これを行うと、そのリストを追跡して構築することができなくなるためです。

その他のいくつかのマイナーポイント:

  • あなたが持っている:

    if (parent.GetType() == typeof(T))
    

    しかし、次のように書くとより明確になります。

    if (parent is T)
    

    もちろん、 のサブクラスで使用したときにメソッドが失敗するTことを本当に望んでいる場合を除きます。

  • として宣言することにより、新しいメソッドを拡張メソッドとして宣言することを検討することをお勧めします(静的クラスで宣言されている場合) parentthis Control parent

    これにより、メソッドを次のように呼び出すことができますthis.GetAllControlsOfType<WebControl>()

于 2012-08-23T01:09:15.470 に答える