ASP.Net:查找实现接口T的父控件

时间:2013-04-24 22:51:15

标签: c# generics interface asp.net-4.0

我有这个方法,它会给我第一个父控件,它是泛型类型T,其中T是Control的子类型。

// Given a Control, find parent Control of T
public static T FindParent<T>(this Control ctrl) where T : Control
{
    var curParent = ctrl.Parent;
    while (curParent != null && !(curParent is T))
    {
        curParent = curParent.Parent;
    }
    return (T)curParent;
}

然而,现在,我想找到一个实现接口T的父控件。当我从方法中删除where T : Control子句时,return (T)curParent行会出现编译错误Cannot convert type 'System.Web.UI.Control' to T

1 个答案:

答案 0 :(得分:3)

在这种情况下,因为curParent被输入Control(来自ctrl.Parent),不,编译器不知道如何转换/转换Control到某个任意泛型类型T。但是,由于您在运行时知道该类型是兼容的,因此您可以通过首先转换为object来轻松解决它:

public static T FindParent<T>(this Control ctrl)
{
    var curParent = ctrl.Parent;
    while (curParent != null && !(curParent is T))
    {
        curParent = curParent.Parent;
    }
    return (T)(object)curParent;
}

在这种情况下,编译器不能抱怨,它只需要相信你知道你在运行时正在做什么,在这种情况下我们会因为curParent is T检查而这样做。