Доступ к частным членам вложенных классов C # - PullRequest
0 голосов
/ 01 ноября 2018

Я новичок в C #, так что я могу быть далеко от того, что я думаю, это проблема, но ... Я использую сторонний SDK для управления данными займа. у меня есть метод "GetPayload ()", который открывает кредит и получает самую последнюю информацию об изменении поля в "datalist".

public object GetPayload()
    {
        // create list to hold field change data
        List<Ignite.Auditing.DataTypes.Request.Field> DataList = new List<Ignite.Auditing.DataTypes.Request.Field>();

        //create and open new session and loan based on user entered GUID            
        Session ses = OpenSession();
        Loan loan = ses.Loans.Open(loanGuidTextBox.Text);

        //call method to get the field change data for this loan
        AuditTrailEntryList dataList = loan.AuditTrail.GetMostRecentEntries();

        Type myTypeB = typeof(AuditTrailEntry);
        FieldInfo myFieldInfo1 = myTypeB.GetField("auditRecord", BindingFlags.NonPublic | BindingFlags.Instance);


        foreach (AuditTrailEntry entry in dataList)
        {

            FieldInfo[] fields = entry.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
          //  FieldInfo value = (FieldInfo)myFieldInfo1.GetValue(entry.auditRecord.PreviousValue);

            FieldData fd = new FieldData
            {
                FieldDated = entry.Timestamp.ToUniversalTime(),
                FieldDescription = entry.Field.Descriptor.ToString(),
                FieldFormat = entry.Field.Format.ToString(),
                FieldId = entry.Field.ID.ToString(),
                NewValue = entry.Field.Value.ToString(),
                // OldValue = e.PriorValue,
                //OldValue = fce.PriorValue,

                OldValue = myFieldInfo1.GetValue(entry).ToString(),

            };                
            DataList.Add(fd);
        }           


        return _serviceInfo.RequestData;
    }

Оттуда я делаю foreach для каждой записи в списке данных, в которой есть информация, которая мне нужна. Затем я заполняю объект «FieldData» (fd) необходимыми данными. проблема в том, что одно из полей, которые мне нужны, похоже, находится в том, что я думаю, является частным полем, основанным на том, что я видел в отладчике (значок замка рядом с «auditRecord»). debugger screen shot Как я могу получить доступ к "entry.auditRecord.PreviousValue"? Я использовал Type.GetField ( документация ), чтобы получить приватный член, который вроде работает в том смысле, что он получает «auditRecord», но как мне перейти к следующему члену, т.е. audRecord.PreviousValue? я просто хочу получить OldValue, который, как я думал, должен быть entry.auditRecord.PreviousValue, но, похоже, он недоступен. Нет ошибки MSG просто неправильные значения. может кто-нибудь помочь?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

@ xiaoy312 я наконец понял! способ, которым я заставил это работать, состоял в том, чтобы включить другую dll "EllieMae.EMLite.ClientServer". Мой менеджер, не являющийся программистом, сказал мне, что вся необходимая мне информация была в предоставленных им dll, но он ошибался. для тех, кто столкнулся с этой проблемой в будущем, я должен был использовать

            //get the type info for the audit trail entry
            FieldInfo myFieldInfo1 = typeof(AuditTrailEntry).GetField("auditRecord", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField);

            //get the value for auditRecord field
            var value = myFieldInfo1.GetValue(entry);

            //get old value field
            var oldValue = ((EllieMae.EMLite.ClientServer.AuditRecord)value).PreviousValue;

чтобы получить старое значение из объекта AuditTrailEntry. спасибо за вашу помощь!

0 голосов
/ 01 ноября 2018

В соответствии с соглашением об именах, auditRecord - это поле, а PreviousValue - это свойство.

Чтобы извлечь значение по отражению, вам нужно перемещаться слой за слоем:

var auditRecordField = typeof(AuditTrailEntry).GetField("auditRecord", BindingFlags.NonPublic | BindingFlags.Instance);
var previousValueProperty = auditRecordField.FieldType.GetProperty("PreviousValue", BindingFlags.NonPublic | BindingFlags.Instance);

// ...

foreach (AuditTrailEntry entry in dataList)
{
    // ...

    var record = auditRecordField.GetValue(entry);
    var value = previousValueProperty.GetValue(record);
}
...