2015-01-06 7 views
6

私はそれがあるタイプであるかどうかを確認できるメソッドに型を渡そうとしています。しかし、以下のコードはコンパイルされず、私は何が間違っているのだろうかと思っています。コンパイルエラーです。型または名前空間の名前 'dataType'が見つかりませんでした。メソッドが渡されたときに型が使用される方法は?

public static List<object> findType(Type dataType) 
{ 
    List<object> items = new List<object>(); 
    foreach (KeyValuePair<int, object> entry in DataSource.ItemPairs) 
    { 
     if (entry.Value != null && entry.Value is dataType) 
     { 
      items.Add(entry.Value); 
     } 
    } 
    return items; 
} 

答えて

9

is演算子は、Typeインスタンスではなく、タイプ名が必要です。この型はコンパイル時に認識される必要があります。あなたが使用することができますしかし

、タイプに互換性があるかどうかを確認するためにIsAssignableFrom方法:

if (entry.Value != null && dataType.IsAssignableFrom(entry.Value.GetType()) 
2

entry.Valueのタイプを確認したいと思います。

はこれを試してみてください:それはタイプTypeの変数でありながら

if (entry.Value != null && dataType.GetType().IsAssignableFrom(entry.Value)) 

それは、dataTypeは、独自のタイプであることを期待しています。

+0

これは 'is'と同じではありません。互換性ではなく、型の等価性のみをチェックします。 –

+0

「is」は「再帰的に」動作することを覚えておいてください。私は、wheter固有の派生クラスが基本型であることを確認すると、それが真(インターフェイスを含む)を返すことを意味します。あなたの場合の単純なコンパイルは、そのようには機能しません。 –

+0

今はもっと良いと思っています。 –

5

isは、C#での特別なコンパイル構文です - あなたがタイプとして変数を置くことができない、あなたは実際の型を記述する必要があります名。あなたは正確なタイプの使用を確認したい場合は

この:あなたはそれが継承されるかどうかを確認したい場合は

if(entry.Value.GetType() == dataType) 

、あなたはこれを使用することができます。

if (entry.Value != null && dataType.IsAssignableFrom(entry.Value.GetType())) 
0

entry.ValueがありますすべてのオブジェクトにGetType()メソッドがあり、これはTypeオブジェクトを返します。 Type.Equalはこれらの型を比較できます。あなたは "is"という言葉を使わずにこれを行うことができます。

あなたは、オブジェクトをreciveと

0

と同様にTypeインスタンスを使用する方法を示す他の回答を入力しないようにしたい「さ」ので、あなたはあなたの方法は、一般的な作ることができる言葉で使用傾けます。これは、あなたがisを使用することができますが、はっきりとコンパイル時に固定されているターゲット・タイプによって異なります:

public static List<object> findType<TTarget>() 
{ 
    List<object> items = new List<object>(); 
    foreach (KeyValuePair<int, object> entry in DataSource.ItemPairs) 
    { 
    if (entry.Value != null && entry.Value is TTarget) 
    { 
     … 
2

あなたはジェネリックとLINQを使用することができた場合は、物事がはるかに簡単になります。 DataSource.ItemPairsが辞書型であると仮定します。

public static List<T> findType<T>() 
{ 
    List<T> items = new List<T>(); 
    foreach (T entry in DataSource.ItemPairs.Values.OfType<T>()) 
    { 
     items.Add(entry); 
    } 
    return items; 
} 

さらにそれよりも短い。

public static List<T> findType<T>() 
{ 
    return DataSource.ItemPairs.Values.OfType<T>().ToList(); 
} 
関連する問題