Доступ к частным членам вложенного класса C#
Я новичок в 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"). Как я могу получить доступ к "entry.auditRecord.PreviousValue"? Я использовал Type.GetField ( документация), чтобы получить приватный член, который вроде работает в том смысле, что он получает "auditRecord", но как мне перейти к следующему члену, т.е. audRecord.PreviousValue? я просто хочу получить OldValue, который, как я думал, должен быть entry.auditRecord.PreviousValue, но, похоже, он недоступен. Нет ошибки MSG просто неправильные значения. может кто-нибудь помочь?
2 ответа
@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. Спасибо за вашу помощь!
Гадание по соглашению об именах, 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);
}