2013-04-24 44 views
1

我有這種方法,它會給我第一個父類控件,它是泛型類型T,其中T是Control的子類型。ASP.Net:查找父控件實現接口T

// 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; 
} 

但是現在,我想找到當我從方法去除where T : Control條款,實現了接口T.父母的控制,return (T)curParent行給出的編譯錯誤Cannot convert type 'System.Web.UI.Control' to T

回答

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檢查。

+0

謝謝,作品像魅力。此外[MSDN文章](http://msdn.microsoft.com/en-us/library/ms379564%28v=vs.80%29.aspx#csharp_generics_topic5)提供了一些洞察**泛型和鑄造** – sparebytes 2013-04-24 23:22:55