2015-01-06 14 views
6

Sto provando a passare un tipo a un metodo in cui posso verificare se è "un determinato tipo". Tuttavia il codice che ho qui sotto non viene compilato e mi sto chiedendo cosa non va. L'errore di compilazione è: non è stato possibile trovare il tipo o il nome dello spazio dei nomi 'dataType'.Come usare 'is' quando il tipo passa attraverso il metodo?

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; 
} 

risposta

9

is L'operatore si aspetta un nome di tipo, non l'istanza Type.Quindi il tipo deve essere noto al momento della compilazione.

Tuttavia è possibile utilizzare, IsAssignableFrom metodo per verificare se i tipi sono compatibili:

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

Immagino di voler controllare il tipo di entry.Value.

Prova questo:

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

si aspetta dataType essere un tipo da solo, mentre è una variabile di tipo Type.

+0

Questa non è la stessa cosa di 'is'. Controlla solo l'uguaglianza di tipo, non la compatibilità. –

+0

Ricorda, che 'is' funziona" in modo ricorsivo ". Intendo quando controlli che la classe derivata specifica sia di tipo base, restituisce true (comprese le interfacce). Il semplice comparsion nel tuo caso non funziona in questo modo. –

+0

Giusto. Spero sia meglio ora. –

5

is è una speciale costrutto compilato in C# - non si può mettere una variabile come il tipo, è necessario scrivere un tipo effettivo nome.

Se si desidera controllare l'esatto utilizzo Tipo questo:

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

Se si desidera controllare se è ereditata, è possibile utilizzare questo:

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

entry.Value è un oggetto, ogni oggetto ha il metodo GetType(), che ti restituisce un oggetto Type. Type.Equal può confrontare questi tipi. Puoi farlo senza usare la parola "è".

non puoi utilizzare la parola perché è "è" Desidero ricevere un oggetto e non digitare

0

Così come le altre risposte che mostrano come utilizzare un'istanza Type, si potrebbe rendere il vostro metodo generico. Ciò consentirebbe di utilizzare is, ma dipende chiaramente dal tipo di destinazione viene fissato al momento della compilazione:

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

Se è possibile utilizzare farmaci generici e LINQ, le cose diventano molto più facile. Supponendo che DataSource.ItemPairs sia un tipo di dizionario.

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; 
} 

O anche inferiore a quello.

public static List<T> findType<T>() 
{ 
    return DataSource.ItemPairs.Values.OfType<T>().ToList(); 
} 
Problemi correlati