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 回答