2017-02-06 2 views
0

У меня проблема при использовании отражения, чтобы получить значение поля readonly staticViewDepartmentCompareReport из статического класса.Доступ к значению статического поля только для чтения приводит к ошибке ссылки на объект с использованием отражения C#

Этот код прекрасно работает в большинстве систем, которые я пытался в том числе несколько в производственной среде, но получаю сообщение об ошибке

Ссылка объекта произошла ошибка

Я создал образец скрипку из этот код здесь https://dotnetfiddle.net/aHCoLb

Ошибка возникает при выдаче значения Value = (BitMask)val.

Пожалуйста, взгляните на код и укажите, есть ли что-то неправильное, что я делаю, что может привести к ошибке ссылки на объект при доступе к полю ViewDepartmentCompareReport через отражение.

Может ли эта ошибка быть конкретной системы, скажем, код, выполняемый в системе x86, ведет себя иначе, чем выполнение в системе x64?

+0

Возможно, значение никогда не было установлено? http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it – Magnus

+0

Пожалуйста, разместите код _ в вопросе_, чтобы люди могли вам помочь. –

+0

Я добавил ссылку https://dotnetfiddle.net/aHCoLb – user581157

ответ

1

Я думаю, что вы на самом деле проблема заключается здесь:

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

Получение списка полей, а затем ссылки на первый в списке и при условии, что она возвращает битовую маску, рискованно. Если вы хотите, чтобы получить первое поле, которое возвращает битовую маску, вы могли бы сделать что-то вроде этого:

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; 

Вы должны еще бросить это в try-catch блок в случае тип не имеет поле с типом Bitmask, но это должно по крайней мере дать вам представление о том, как вы можете двигаться вперед.

Надеюсь, что это поможет.

+0

Код, который я использовал, просто для иллюстрации. У меня есть цикл, который затем генерирует что-то вроде для (поле var в полях) { BitMask bm = (битмаск) field.GetValue (null); } Класс, который я использую для чтения значения, содержит только одно поле и никакое другое поле, которое является классом Sample, которое является статическим и одно поле только для чтения «ViewDepartmentCompareReport» – user581157

+0

Я знал, что, когда я разместил код, но ссылаясь на определенный индекс в список по-прежнему опасен, потому что есть потенциальные неизвестные. Это особенно верно, если вы не можете воспроизвести проблему локально. Фильтрация результата зависит от того, что, по вашему мнению, вам нужно, уменьшает или даже удаляет неизвестные. – MichaelDotKnox

Смежные вопросы