访问私有嵌套 class 成员 C#
Access private nested class memebers C#
我是 C# 的新手,所以我可能与我认为的问题相去甚远,但是...
我使用第 3 方 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 (documentation) 来获取私有成员,它的工作原理是它获取 "auditRecord",但我如何深入到下一个成员,即 auditRecord.PreviousValue?我只想获取 OldValue,我认为它应该是条目。auditRecord.PreviousValue 但它似乎无法访问。没有错误消息只是错误的值。有人可以帮忙吗?
按照命名规则猜测,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);
}
@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 对象中获取旧值。感谢您的帮助!
我是 C# 的新手,所以我可能与我认为的问题相去甚远,但是... 我使用第 3 方 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" 旁边的锁定图标),我需要的字段之一似乎是我认为的私有字段。
按照命名规则猜测,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);
}
@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 对象中获取旧值。感谢您的帮助!