2009-07-06 3 views
2

J'ai une méthode que j'écris qui utilise la réflexion pour lister les propriétés statiques d'une classe, mais je ne m'intéresse qu'à celles qui sont d'un type particulier (dans mon cas, la propriété doit être d'un type dérivé de DataTable) . Ce que je voudrais quelque chose comme si() déclaration dans ce qui suit (qui retourne actuellement toujours vrai):Comment utilisez-vous l'opérateur IS avec un type sur le côté gauche?

PropertyInfo[] properties = (typeof(MyType)).GetProperties(BindingFlags.Public 
    | BindingFlags.Static); 

foreach(PropertyInfo propertyInfo in properties) { 
    if(!(propertyInfo.PropertyType is DataTable)) 
     continue; 

    //business code here 
} 

Merci, je suis perplexe.

Répondre

8

Vous devez utiliser Type.IsAssignableFrom à la place de l'opérateur "is".

Ce serait:

if(!(DataTable.IsAssignableFrom(propertyInfo.PropertyType)) 

DataTable.IsAssignableFrom(propertyInfo.PropertyType) sera vrai si PropertyType est un DataTable ou une sous-classe de DataTable.

1
if(!(propertyInfo.PropertyType.isSubClassOf(typeof(DataTable))) 
continue; 

Je pense que cela devrait le faire.

+2

Cela échouera si PropertyType est un DataTable, cependant. –

+1

Je ne le savais pas, c'est logique. – Kazar

1
if (!(typeof(DataTable).IsAssignableFrom(propertyInfo.PropertyType))) 

La commande ici semble peut-être un peu en arrière, mais pour Type.IsAssignableFrom, vous voulez le type que vous devez travailler pour venir en premier, puis le type que vous vérifiez.

Questions connexes