2010-10-08 2 views
1

cela me semble étrange à:Vérifiez si le typeof (objet) dans une liste est un type de référence

if(customerList.Count > 0) 
{ 
    if(typeof(customerList[0]).IsReferenceType) 
    { 
     // do what I want 
    } 
} 

Comment décririez-vous le faire?

+0

Pouvez-vous faire de la question claire? Que veux-tu réellement faire? – rkg

+0

voir ma question titre :) Il y a une question ... – Elisabeth

+0

Toujours pas très clair. Veuillez modifier la question afin qu'elle contienne les informations cruciales qui expliquent pourquoi les réponses existantes sont insuffisantes. – Timwi

Répondre

0
bool isReferenceType = !(customerList[0] is ValueType); 

EDIT

Vous cherchez quelque chose comme:

bool listIsOfReferenceTypeObjects = !myList.GetType().GetGenericArguments()[0].IsValueType; 
+0

Qu'est-ce que vous en pensez pourquoi j'ai fait IF (customerList.Count> 0) ... – Elisabeth

+0

Ai-je vraiment besoin de dire ne pas accéder à List's index 0 lorsque la liste.Compte est zéro? – Elisabeth

8
  1. Pour déterminer si le premier élément d'une liste est un objet d'un type de référence:

    bool isReferenceType = !(customerList[0] is ValueType); 
    
  2. T o déterminer si une liste est un List<T> pour certains T qui est un type de référence:

    var listType = customerList.GetType(); 
    if (!listType.IsGeneric || listType.GetGenericTypeDefinition() != typeof(List<>)) 
        // It’s not a List<T> 
        return null; 
    return !listType.GetGenericArguments()[0].IsValueType; 
    
+0

Le plus d'exception que j'ai eu parce que le customerList est vide et il n'y a pas d'index ...: P – Elisabeth

+0

Comment est-ce que je pourrais récupérer isReferenceType quand la liste n'a aucun objet? mais la liste dit son de type T comme client. En fait, je n'ajoute pas d'objet client pour savoir si ma liste prend des clients de type Client ... – Elisabeth

+0

@Lisa: Vous cherchez probablement la deuxième solution dans ma réponse. (Il est pas encore très clair cependant. Pourquoi ne pouvez-vous dire exactement ce que vous avez et ce que vous avez besoin?) – Timwi

1

Vous essayez probablement de déterminer le type réel du paramètre générique d'une collection générique. Comme déterminer à l'exécution ce qu'est un T d'un List<T> particulier. Pour ce faire:

Type collectionType = typeof(customerList); 
Type parameterType = collectionType.GetGenericArguments()[0]; 
bool isReference = !parameterType.IsValueType; 
+0

Il convient de noter que 'Liste ' se comportera différemment d'une 'Liste ' qui détient des instances de 'structImplementingIEnumerator'. Ce qui compte est de savoir si la liste encapsule des éléments ou des références à des éléments. Si la liste encapsule des références à des éléments, peu importe si ces éléments dérivent eux-mêmes de 'ValueType' - ils se comporteront comme des objets de classe de toutes les manières sauf pour une implémentation de' Equals' probablement cassée. – supercat

-1

ok qui a fonctionné et je ne reçois aucune exception, lorsque la customerList est vide.

Type collectionType = customerList.GetType(); 
    Type parameterType = collectionType.GetGenericArguments()[0]; 
    bool isReference = !parameterType.IsValueType; 

@Adesit vous obtenez un point parce que votre échantillon avait raison, sauf la première ligne: P

+1

c'est exactement identique au deuxième point de ma réponse, sauf que le mien ne plante pas quand ce n'est pas un type générique. – Timwi

+0

@Timwi Hm vous avez édité votre solution, peut-être que je ne l'ai pas lu. J'ai juste besoin de savoir si le 'T' d'une liste est un type de valeur (int) ou un type de référence (classe personnalisée). De mon côté, rien ne se brise. – Elisabeth

+0

Bien sûr, il se bloque! Essayez de transmettre * n'importe quoi * qui n'est pas un type générique, par ex. une 'chaîne' ... – Timwi

Questions connexes