C#泛型 - 接受不同类型

时间:2010-12-03 05:56:47

标签: c# types generics

我正在尝试编写一个通用方法,以避免代码重复。泛型方法必须能够接受三种不同网格视图类型中的一种,但是我无法在泛型方法的开头使用以下强制转换工作;

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;

如何将“网格”转换为三种类型中的任何一种,以便我可以使用它们执行某些操作。我仍然试图掌握Generics背后的想法和概念。

3 个答案:

答案 0 :(得分:3)

如果BrandedGridViewAdvBrandedGridView都从GridView继承,您可以为您的通用

添加约束

...<T> where T : GridView

如果没有,您可以使用Convert.ChangeType

尝试Convert.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));
}

答案 1 :(得分:1)

您希望将类型T约束为某种东西(可能是GridView,因为其他2种类型可能是从它派生的)所以C#知道T有什么方法,否则它只是Object类型。

public class MyClass<T> where T : GridView

请阅读有关MSDN上的通用的文章以获取更多详细信息 - http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx#csharp_generics_topic4

注意:如上所述,C#不是JavaScript,“var”不代表“一种类型”,它只是声明右侧类型对象的简短方法。即in var my = new List()var是List的synonim。

答案 2 :(得分:0)

“除参数类型”

外,方法相同

我认为您应该创建一个具有视图的不同参数类型的新方法作为实际参数。毕竟他们是不同的。