0

「コントロールの比較」をハードコーディングする必要をなくして、次のコードをGENERIC関数に変換しようとしています。これを達成する方法はありますか?:)

    private Control getControlByAccessible(string accessDesc, string accessName, Control wrapper)
    {
        foreach (Control ctrl in wrapper.Controls)
        {
            if (ctrl is TextBox)
            if (ctrl.AccessibleDescription == accessDesc && ctrl.AccessibleName == accessName)
                return ctrl;
        }
        return null;
    }

これは私の最初の試みであり、これまでのところ何の結果も得られませんでした。

    private Control getControlByAccessible(string accessDesc, string accessName, Control wrapper, Type aControlType)
    {
        foreach (Control ctrl in wrapper.Controls)
        {
            if (ctrl is aControlType)
            if (ctrl.AccessibleDescription == accessDesc && ctrl.AccessibleName == accessName)
                return ctrl;
        }
        return null;
    }
4

1 に答える 1

8

あなたが使用することができますType.IsInstanceOfType

if (aControlType.IsInstanceOfType(ctrl))

ただし、個人的には、可能であれば型パラメーターを使用した真のジェネリックメソッドにしてから、LINQのOfTypeメソッドを使用します。私はおそらくそれを拡張メソッドにするでしょう:

// This would need to be in a top-level non-generic class
public static T GetControlByAccessible<T>(this Control wrapper,
    string description, string name) where T : Control
{
    return wrapper.Controls
                  .OfType<T>()
                  .FirstOrDefault(c => c.AccessibleDescription == description &&
                                       c.AccessibleName == name);
}

次に、次のように呼び出します。

TextBox tb = someContainer.GetControlByAccessible<TextBox>("name", "desc");
于 2012-06-11T07:16:05.270 に答える