在 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;
请注意,没有编译时检查 Department
或 Name
部分(或者结果类型是 string
),但这与基于反射的相同无论如何代码。动态类型只会在执行时为您进行反射。
我有一个这样的对象
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 是这样的:
一旦我使用下面的代码通过反射获取部门的名称字段,我得到了这个错误
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;
请注意,没有编译时检查 Department
或 Name
部分(或者结果类型是 string
),但这与基于反射的相同无论如何代码。动态类型只会在执行时为您进行反射。