2010-12-03 82 views
0

我想写一个通用的方法,所以我可以避免代码重复。泛型方法必须能够接受三种不同的网格视图类型中的一种,但是我不能在泛型方法的开始时使用以下强制转换工作;C#泛型 - 接受不同类型

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; 

如何将“网格”投射到三种类型中的任何一种,以便我可以对它们做些什么。我仍然试图理解泛型背后的想法和概念。

+0

这三种类型是否具有相同的接口(不是语言意义上的接口,而是API意义上的接口)? – 2010-12-03 05:59:08

+0

你不能声明一个var,然后初始化它。两者应该在一个单独的步骤中完成。就像var a = 100 – 2010-12-03 06:01:09

回答

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

你想约束类型T的东西(可能GridVi因为其他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”并不意味着“一型”它是只短路声明右侧的类型的对象。即在var my = new List()中var是synonim的List。

0

“方法相同,只是参数类型相同的”

我想你应该只是使具有视图作为实际参数的不同参数类型的新方法。毕竟他们是不同的。