2010-12-03 86 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

「方法相同,只是參數類型相同的」

我想你應該只是使具有視圖作爲實際參數的不同參數類型的新方法。畢竟他們是不同的。