Comment écrire une méthode simple, qui vérifie si un type de béton est une structure personnalisée (créée avec Vérification Ces questions sont la plupart des mêmes mais sans la réponse dont j'ai besoin: P > EDIT: à partir des réponses mentionnées, le "préfixe" de la vérification du système "était le plus stable (bien que ce soit toujours un piratage). J'ai finalement décidé de créer un attribut que vous devez décorer la structure avec, afin que le cadre le ramasse comme une structure personnalisée. (L'autre choix que je pensais était de créer une interface vide et de laisser la structure implémenter cette interface vide, mais l'attribut Way semble plus élégante) p> Voici mon vérificateur de structure personnalisé original si quelqu'un s'intéresse: < / p> Public Strart {}; code>) ou non.
Type.isvalueType < / code> ne suffit pas, car il est également fidèle à
int code>,
long code>, etc., etc.,
et ajouter un chèque à
! isprimitivestype code> exclurea
décimal code>,
DateTime code> et peut-être d'autres types de valeur. Je sais que la plupart des types de valeur intégrée sont en réalité des "structures", mais je veux seulement vérifier "Structs personnalisés" p>
5 Réponses :
Eh bien, datetétime, décimale, etc. répond à vos besoins. En ce qui concerne le CLR concerné, ce sont des structures personnalisées. Un hack, mais vous pouvez simplement vérifier si l'espace de noms commence par "Système". P>
Bien sûr, votre propre espace de noms pourrait commencer par le système ... :) Personne ne ferait cela, non?
Oui, c'est pourquoi j'ai appelé qu'un hack.
@Mattgreer: Great Hack en passant, je ne pouvais pas penser à ça :) merci
Il n'y a pas de différence entre une structure définie dans le cadre et une structure définie par vous-même. p>
Un couple d'idées pourrait être: p>
Dans le contexte du commentaire sur l'utilisation de NHibernate fluide, une liste blanche de structures "bien connues" serait la meilleure approche. La liste est suffisamment courte pour être facilement comprise et risque de ne jamais changer.
D'accord, comme vous y trouvez chacun qui provoque un crash, ajoutez-le à la liste blanche (ou liste noire ou autre que vous l'appelez) et continuez. Le cadre n'a pas trop de structs.
Oui, mais malheureusement, il n'y a pas de liste pour cela. Et si vous manquez quelque chose et utilisez cette structure plus tard, vous ne saurez pas pourquoi les cadres commencent à se planter
Vous pouvez vérifier si le type de structure tombe sous n'importe où dans Espace de noms système forte>. Mais encore une fois ce n'est pas une solution fiable. P>
Mettre les commentaires ci-dessus dans une méthode d'extension:
public static class ReflectionExtensions { public static bool IsCustomValueType(this Type type) { return type.IsValueType && !type.IsPrimitive && type.Namespace != null && !type.Namespace.StartsWith("System."); } }
Avez-vous une valeur qui va avec ce type? Appelez la méthode Si vous n'avez pas de valeur, vérifiez s'il a un constructeur sans paramètre. Si ce n'est pas le cas, c'est un constructeur. Si tel est le cas, utilisez l'activateur code> pour créer une instance et appelez à nouveau la méthode tostring code> et vérifiez si la chaîne renvoyée commence par "{". P>
tostring code>. P>
Juste hors de curiosité, pourquoi voulez-vous le détecter?
Nibernate fluide + Mappage automatique: définissez toutes les structures de fabrication personnalisées à traiter en tant que composants (objets de valeur); Réglage de tout autre type de valeur pour être un composant (comme DateTime ou décimal) plantera tout le cadre (au moins il fait sous Mono)