2011-09-01 86 views
2

我想通过能够创建一个动态的GetControl方法保存一些编码。我的想法是这样铸造到泛型失败在c#

private T GetControl<T>(ASPxGridView control, string element) 
{ 
    var returnedElement = (T)control.FindEditFormTemplateControl(element); 
    return returnedElement; 
} 

我与

var myElement = GetControl<ASPxTextBox>(myGridView, "UserId"); 

但是打电话,失败草草收场:

无法将类型 'System.Web.UI.Control' 到' T'

任何建议?

+2

这是通用的,不是动态的。不要混淆这两个术语。它有多失败? – BoltClock

+0

无论如何,铸造到这种类型都是动态的。通过使用泛型。建设性而不是... –

+2

不,它不是。 'dynamic'在c#中有非常具体的含义。 http://msdn.microsoft.com/en-us/library/dd264736.aspx – asawyer

回答

4

尝试添加通用约束:

private T GetControl<T>(ASPxGridView control, string element) where T : Control 
{ 
    var returnedElement = (T)control.FindEditFormTemplateControl(element); 
    return returnedElement; 
} 
+0

这也行不通。 /编辑:它的工作。这似乎很愚蠢。 –

3

您可以通过object铸造规避类型安全:

var returnedElement = (T)(object)control.FindEditFormTemplateControl(element); 

此外,我会限制你的泛型类型Web.UI.Control,如果只是为了个人文档的目的:

private T GetControl<T>(ASPxGridView control, string element) 
    where T: System.Web.UI.Control 
{ 
    return (T)control.FindEditFormTemplateControl(element); 
} 
+0

对于类型约束,您不应该投射到对象 –

+1

@我看到(刚刚测试过)但我不明白为什么。这种转换是完全不安全的,事实上,没有(类)约束没有安全性。 –

+0

约束意味着T必须可转换为System.Web.UI.Control,它本质上是它所做的,它告诉编译器执行该要求。 –