C#将'TYPE'作为参数传递,然后与'is'比较

时间:2012-06-11 07:11:14

标签: c#

我正在尝试将以下代码转换为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;
    }

1 个答案:

答案 0 :(得分: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");