在 C# 中获取具有反射的复杂类型的 属性 值

Get property value of a complex type with reflection in c#

我有一个这样的对象

oldEntity
     Active: true
    ActiveDirectoryName: ""
    ArchiveConceptValueList: null
    AsgScndCnpRangeDictionary: Count = 0
    AssignedRuleList: {NHibernate.Collection.Generic.PersistentGenericBag<GTS.Clock.Model.AssignedRule>}
    AssignedScndCnpRangeList: {NHibernate.Collection.Generic.PersistentGenericBag<GTS.Clock.Model.AssignedScndCnpRange>}
    AssignedScndCnpRangePeresentList: {NHibernate.Collection.Generic.PersistentGenericBag<GTS.Clock.Model.AssignedScndCnpRange>}
    AssignedWGDShiftList: {NHibernate.Collection.Generic.PersistentGenericBag<GTS.Clock.Model.AssignedWGDShift>}
    AssignedWorkGroupList: {GTS.Clock.Model.PersonWorkGroup, GTS.Clock.Model.PersonWorkGroup}
    Assistant: null
    BarCode: "0451343786"
    BasicTrafficController: {GTS.Clock.Model.Concepts.BasicTrafficController}
    BasicTrafficList: {}
    BudgetList: null
    CFPNeedUpdate: false
    CalcDateZone: null
    CardNum: "2465"
    CartOrgan: {GTS.Clock.Model.Charts.Department}
    CheckEnterAndExitInRequest: false
    CostCenter: {GTS.Clock.Model.BaseInformation.CostCenter}
    CurrentActiveContract: null
    CurrentActiveDateRangeGroup: null
    CurrentActiveRuleGroup: null
    CurrentActiveWorkGroup: null
    CurrentRangeAssignment: null
    CurrentYearBudgetList: {NHibernate.Collection.Generic.PersistentGenericBag<GTS.Clock.Model.Concepts.CurrentYearBudget>}
    DelayCartableList: {}
    Department: {GTS.Clock.Model.Charts.Department}
    DepartmentID: 0
    ...

我想要部门的名称字段。 除了 oldEntity 中的 Department 是这样的: Department 字段的属性如下:

一旦我使用下面的代码通过反射获取部门的名称字段,我得到了这个错误

oldEntity.GetType().GetProperty("Department").GetValue("Name", null);

Object does not match target type.

您正在尝试获取 属性 的值,就好像它是 string 的 属性 - GetValue 的第一个参数需要是您正在从中获取 属性 的对象(在本例中为 oldEntity)。所以你可以得到这样的部门:

object department = oldEntity.GetType().GetProperty("Department").GetValue(oldEntity, null);

要获得 Name 属性(我 希望 是一个 属性 而不是 public 字段)你需要再次做同样的事情:

object name = department.GetType().GetProperty("Name").GetValue(department, null);

但是,您可以使用动态类型更简单地完成这一切:

dynamic entity = oldEntity;
string name = entity.Department.Name;

请注意,没有编译时检查 DepartmentName 部分(或者结果类型是 string),但这与基于反射的相同无论如何代码。动态类型只会在执行时为您进行反射。