2017-02-06 2 views
0

J'ai un problème lors de l'utilisation de la réflexion pour obtenir la valeur readonly static du champ ViewDepartmentCompareReport d'une classe statique.L'accès à la valeur d'un champ statique en lecture entraîne une erreur de référence d'objet en utilisant la réflexion C#

Ce code fonctionne très bien dans la plupart des systèmes que je l'ai essayé, y compris quelques-unes dans des environnements de production, mais obtenir une erreur

Une erreur de référence d'objet est produite lors

J'ai créé un violon échantillon de ce code est https://dotnetfiddle.net/aHCoLb

L'erreur est renvoyée lorsque la diffusion de la valeur Value = (BitMask)val a lieu.

Veuillez regarder le code et indiquer s'il y a quelque chose de mal que je fais qui pourrait entraîner une erreur de référence d'objet lors de l'accès au champ ViewDepartmentCompareReport par réflexion.

Cette erreur peut-elle être spécifique au système? Le code en cours d'exécution sur un système x86 se comporte-t-il différemment de l'exécution sur un système x64?

+0

Peut-être que la valeur n'a jamais été définie? http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it – Magnus

+0

Veuillez poster le code _dans la question_ afin que les gens puissent vous aider. –

+0

J'ai ajouté ce lien https://dotnetfiddle.net/aHCoLb – user581157

Répondre

1

Je pense que vous problème est vraiment ici:

var fields = t.GetFields(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Static); 
var val = fields[0].GetValue(null); 
var name = fields[0].Name; 

Obtenir une liste de champs et faisant référence à la première dans la liste et en supposant qu'il retourne un Bitmask est risqué. Si vous voulez obtenir le premier champ qui retourne une Bitmask, vous pouvez faire quelque chose comme ceci:

var fields = t.GetFields(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Static); 
var field = fields.First(_ => _.FieldType == typeof(BitMask)); 
var val = field.GetValue(null); 
var name = field.Name; 

Vous devriez toujours jeter cela dans un bloc try-catch dans le cas où le type n'a pas un champ de type Bitmask, mais Cela devrait au moins vous donner une idée de la façon dont vous pouvez aller de l'avant.

Espérons que ça aide.

+0

Le code que j'ai utilisé est juste à titre d'illustration. J'ai une boucle qui jette alors quelque chose comme pour (champ var dans les champs) { BitMask bm = (BitMask) field.GetValue (null); } La classe que j'utilise pour lire la valeur contient seulement un champ et aucun autre champ qui est la classe Sample qui est statique et un champ readonly "ViewDepartmentCompareReport" – user581157

+0

Je savais que lorsque j'ai posté le code, mais référençant un index spécifique dans une liste est toujours risquée car il existe des inconnues potentielles. Ceci est particulièrement vrai si vous ne pouvez pas reproduire le problème localement. Filtrer votre résultat en fonction de ce dont vous avez besoin réduit ou supprime même les inconnues. – MichaelDotKnox