2010-12-03 12 views
0

私はコードの重複を避けるために汎用メソッドを書こうとしています。ジェネリックメソッドは、3つの異なるグリッドビュータイプのうちの1つを受け入れることができる必要がありますが、ジェネリックメソッドの開始時に以下のキャストを機能させることはできません。C#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; 

"グリッド"を3つのタイプのいずれかにキャストするにはどうすればよいですか?私はまだジェネリックスの考え方とコンセプトを理解しようとしています。

+0

3つのタイプは同じインターフェースを持っていますか(言い換えればインターフェースではなくAPIの意味で)? –

+0

あなたはvarを宣言することはできませんし、後でそれを初期化します。一つのステップで行う必要があります。ちょうどvar a = 100のように –

+0

私は彼らがすべて同じインターフェースを守っているかわかりません。私は現在、それぞれ異なるタイプを受け入れる3つの別々のメソッドを持っていますが、各タイプのプロパティは同じです。すなわち、メソッドはパラメータタイプ – Josata

答えて

3

BrandedGridViewAdvBrandedGridView両方がGridViewから継承する場合は、Convert.ChangeTypeを使用することができない場合は、あなたの一般的な

...<T> where T : GridView

に制約を追加することができます

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)); 
} 
+0

BrandedgridViewがgridviewと互換性がない場合はどうなりますか?その場合、Convert.ChangeTypeの戻り値は何ですか? –

+0

ChangeTypeは私が探しているものです。 – Josata

+0

3つのタイプはすべて互換性があります – Josata

1

タイプTを何かに拘束したい(GridVi 2つの他の型がそれから派生している可能性が高いので)、C#はTの持つメソッドを知っています。それ以外の場合はObject型です。 C#の上述したように、JavaScriptと「varが」「タイプ」は、それがちょうど短い道であることを意味しませんではありません。http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx#csharp_generics_topic4

注 -

public class MyClass<T> where T : GridView 

詳細を取得するにはMSDNのジェネリックについての記事をお読みください右側の型のオブジェクトを宣言します。私。 var my = new List()varはListのsynonimです。

0

私はあなただけで、実際のパラメータとしてビューの異なるパラメータ型を持つ新しいメソッドを作るべきだと思い

「メソッドは、パラメータの種類を除いて同一です」。彼らは結局異なっているものです。

関連する問題