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一样,我不确定它们是否都遵守相同的接口。我目前有三种不同的方法,每种方法都接受不同的类型,但每种类型的属性都相同,即除了参数typeTry
T grid
而不是
var grid
之外,其他方法都是相同的。当您使用泛型时,很少需要执行任何类型转换。如果BrandedgridView与gridview不兼容怎么办?在这种情况下,Convert.ChangeType将返回什么?ChangeType正是我要寻找的。这三种类型都是compatible@SrinivasReddy Thatiparthy它将抛出异常。详情请参见。@Josata-很高兴听到这个消息,尽管如果这三个人都有共同的祖先,添加约束并在它们之间进行强制转换将节省
Convert.ChangeType
中的反射开销,如果BrandedgridView与gridview不兼容该怎么办?在这种情况下Convert.ChangeType将返回什么?ChangeType正是我要寻找的。这三种类型都是compatible@Srinivas雷迪,它会扔的例外。有关详细信息,请参阅。@Josata-很高兴听到这个消息,不过如果这三个都有共同的祖先,添加约束并在它们之间进行强制转换将节省
Convert.ChangeType中的反射开销