2010-12-14 70 views
4

Je travaille avec un traducteur d'objet basé sur la réflexion.Détection d'objets natifs avec réflexion

il bascule fondamentalement à travers les propriétés d'un objet et affecte les valeurs aux propriétés ayant le même nom/type sur l'objet traduit.

ObjectA.Name = "Joe"

se traduit par:

ObjectB.Name = "Joe"

je dois mettre un cas particulier, car quand une propriété est une classe personnalisée telle que:

ObjectA.Address

j'espérais pouvoir détecter ces propriétés avec IsClass drapeau de PropertyType

propInfo.PropertyType.IsClass 

mais ce drapeau semble aussi revenir vrai pour les propriétés de chaîne.

Y at-il une autre façon de vérifier que la propriété est d'un type non natif?

+0

La chaîne n'est pas un type de valeur non plus - c'est * une * classe. Si vous essayez de déterminer quelles propriétés contiennent des objets * mutable *, bonne chance avec ça ... (Aussi, comment définissez-vous le type "natif"?) – cdhowie

+3

La question n'a pas de sens à moins que "type natif" == "type de référence ". –

+0

Le mot "natif" doit être retiré de la question/du titre. C'est confu. Quand je lis 'natif', je pense aux constructions WIN32. – Amy

Répondre

5

Je suppose que vous voulez déterminer si le type cible n'est pas un primitif. Vous pouvez probablement utiliser TypeCode pour cela, par exemple:

public bool IsNotCoreType(Type type) 
{ 
    return (type != typeof(object) && Type.GetTypeCode(type) == TypeCode.Object); 
} 

Toute non-primitive devrait revenir TypeCode.Object à la suite de Type.GetTypeCode, afin que nous puissions vérifier que nous obtenons cela et que le type lui-même ne System.Object.

Peut-être que cela aiderait?

MISE À JOUR: J'ai rebaptisés la méthode IsNotCoreType pour couvrir les primitives et les non-primitives telles que String, DateTime, etc. (voir les commentaires ci-dessous).

+2

Pourquoi ne pas simplement utiliser' type.IsPrimitive'? – cdhowie

+0

^Parce qu'il aurait encore besoin de faire face à 'System.String' –

+0

@Matthew: Je vois. Mais notez que la chaîne ** n'est pas ** un type primitif. (Et d'ailleurs, ni l'un ni l'autre n'est objet.) Votre nom de méthode est donc très trompeur. – cdhowie

1

string est une exception, le seul type primitif dans .NET qui est un type de référence. Vous devez considérer cette exception dans votre code afin de vérifier si IsClass est vrai et que le type n'est pas identique à System.String.

+0

La chaîne n'est pas un type primitif. 'csharp> typeof (chaîne) .IsPrimitive;' -> 'false' – cdhowie