C#泛型-接受不同类型
我正在尝试编写一个通用方法,以避免代码重复。通用方法必须能够接受三种不同网格视图类型中的一种,但是我无法在通用方法开始时使以下转换工作C#泛型-接受不同类型,c#,types,generics,C#,Types,Generics,我正在尝试编写一个通用方法,以避免代码重复。通用方法必须能够接受三种不同网格视图类型中的一种,但是我无法在通用方法开始时使以下转换工作 var grid; if (typeof(T) == typeof(GridView)) { grid = (GridView)gridView; } else if (typeof(T) != typeof(BandedGridVi
var grid;
if (typeof(T) == typeof(GridView))
{
grid = (GridView)gridView;
}
else if (typeof(T) != typeof(BandedGridView))
{
grid = (BandedGridView)gridView;
}
else if (typeof(T) != typeof(AdvBandedGridView))
{
grid = (AdvBandedGridView)gridView;
}
else return;
如何将“网格”投射到这三种类型中的任何一种,以便对它们进行处理。我仍在努力理解泛型背后的思想和概念。如果
BrandedGridView
和AdvBrandedGridView
都继承自GridView
,则可以为泛型添加约束
。。。其中T:GridView
如果没有,您可以使用转换.ChangeType
:
请尝试转换.ChangeType:
if (typeof(T) == typeof(GridView))
{
var grid = (GridView)Convert.ChangeType(gridView, typeof(GridView));
}
elseif (typeof(T) == typeof(BrandedGridView))
{
var grid = (BrandedGridView)Convert.ChangeType(gridView, typeof(BrandedGridView));
}
如果
BrandedGridView
和AdvBrandedGridView
都继承自GridView
,则可以向泛型视图添加约束
。。。其中T:GridView
如果没有,您可以使用转换.ChangeType
:
请尝试转换.ChangeType:
if (typeof(T) == typeof(GridView))
{
var grid = (GridView)Convert.ChangeType(gridView, typeof(GridView));
}
elseif (typeof(T) == typeof(BrandedGridView))
{
var grid = (BrandedGridView)Convert.ChangeType(gridView, typeof(BrandedGridView));
}
您希望将类型T约束到某个对象(可能是GridView,因为其他两个类型可能都是从它派生的),以便C#知道T有什么方法,否则它只是Object类型
public class MyClass<T> where T : GridView
公共类MyClass其中T:GridView
请阅读MSDN上有关泛型的文章以了解更多详细信息-
注意:如上所述,C#不是JavaScript,“var”并不意味着“a type”,它只是声明右侧类型的对象的较短方法。例如,在var my=new List()中,var是List的同义词。您希望将类型T约束到某个对象(可能是GridView,因为其他两个类型可能都是从它派生的),以便C#知道T有什么方法,否则它只是Object类型
public class MyClass<T> where T : GridView
公共类MyClass其中T:GridView
请阅读MSDN上有关泛型的文章以了解更多详细信息-
注意:如上所述,C#不是JavaScript,“var”并不意味着“a type”,它只是声明右侧类型的对象的较短方法。也就是说,在var my=new List()中,var是List的同义词。“除了参数类型之外,其他方法都是相同的”
我认为您应该创建一个新方法,将视图的不同参数类型作为实际参数。它们毕竟是不同的。“除了参数类型之外,方法是相同的”
我认为您应该创建一个新方法,将视图的不同参数类型作为实际参数。它们毕竟是不同的。这三种类型是否有相同的接口(不是语言意义上的接口,而是API意义上的接口)?您不能声明一个变量并在以后初始化它。这两种操作都应该在一个步骤中完成。就像var a=100一样,我不确定它们是否都遵守相同的接口。我目前有三种不同的方法,每种方法都接受不同的类型,但每种类型的属性都相同,即除了参数typeTry
T grid
而不是var grid
之外,其他方法都是相同的。当您使用泛型时,很少需要执行任何类型转换。这三种类型是否具有相同的接口(不是语言意义上的接口,而是API意义上的接口)?您不能声明一个变量并在以后初始化它。这两种操作都应在一个步骤中完成。就像var a=100一样,我不确定它们是否都遵守相同的接口。我目前有三种不同的方法,每种方法都接受不同的类型,但每种类型的属性都相同,即除了参数typeTryT grid
而不是var grid
之外,其他方法都是相同的。当您使用泛型时,很少需要执行任何类型转换。如果BrandedgridView与gridview不兼容怎么办?在这种情况下,Convert.ChangeType将返回什么?ChangeType正是我要寻找的。这三种类型都是compatible@SrinivasReddy Thatiparthy它将抛出异常。详情请参见。@Josata-很高兴听到这个消息,尽管如果这三个人都有共同的祖先,添加约束并在它们之间进行强制转换将节省Convert.ChangeType
中的反射开销,如果BrandedgridView与gridview不兼容该怎么办?在这种情况下Convert.ChangeType将返回什么?ChangeType正是我要寻找的。这三种类型都是compatible@Srinivas雷迪,它会扔的例外。有关详细信息,请参阅。@Josata-很高兴听到这个消息,不过如果这三个都有共同的祖先,添加约束并在它们之间进行强制转换将节省Convert.ChangeType中的反射开销