访问私有嵌套类成员C#

时间:2018-11-01 19:58:04

标签: c# private-members fieldinfo

我是C#的新手,所以我可能对我认为的问题不太了解,但是... 我正在使用第三方SDK来管理贷款数据。我有一个方法“ GetPayload()”,该方法可以发放贷款并将最新的字段更改信息获取到“数据列表”中。

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(documentation)来获取私有成员,它的某种工作方式是获取“ auditRecord”,但是我该如何下钻到下一个成员,即auditRecord.PreviousValue?我只想获取OldValue,我认为它应该是entry.auditRecord.PreviousValue,但似乎无法访问。没有错误味精只是错误的值。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

根据命名约定猜测,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);
}

答案 1 :(得分:0)

@ 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对象获取旧值。谢谢您的帮助!