如何通过反射获取MerchantWSBO中MerchantWSVO的属性值?
解决方案
问题分析
你原代码存在几个关键错误:
overviewField是私有字段而非属性,不能用GetProperty获取,需改用GetField;且不应新建MerchantWSVO实例,要从传入的MerchantWSBO对象中提取对应实例。- 目标
discoverRetainedField是MerchantWSVO的私有字段,必须通过反射指定绑定标识才能访问。
实现方式
方式1:强转+反射(高效,类型明确时推荐)
直接将classObject强转为MerchantWSBO,通过公共属性overview拿到MerchantWSVO实例,再反射获取私有字段值:
private string ClassToXML(Object classObject) { MerchantTest mt = new MerchantTest(); if (classObject is MerchantWSBO merchantBO) { MerchantWSVO merchantVO = merchantBO.overview; if (merchantVO != null) { // 反射获取私有字段discoverRetainedField的值 var field = typeof(MerchantWSVO).GetField("discoverRetainedField", BindingFlags.NonPublic | BindingFlags.Instance); bool? discoverRetainedValue = (bool?)field.GetValue(merchantVO); // 处理Nullable<bool>空值情况后赋值 mt.overview.discoverRetained = discoverRetainedValue ?? false; // 同步设置Specified标记(若需要) mt.overview.discoverRetainedSpecified = discoverRetainedValue.HasValue; } } var myString = new System.IO.StringWriter(); var serializer = new XmlSerializer(classObject.GetType()); serializer.Serialize(myString, classObject); return myString.ToString(); }
方式2:全反射(适配类型不确定场景)
若不想强转,全程用反射处理:
private string ClassToXML(Object classObject) { MerchantTest mt = new MerchantTest(); if (classObject.GetType() == typeof(MerchantWSBO)) { // 反射获取公共属性overview的值(优先用公共属性,私有成员可能随版本变更) var overviewProperty = classObject.GetType().GetProperty("overview"); MerchantWSVO merchantVO = (MerchantWSVO)overviewProperty.GetValue(classObject); if (merchantVO != null) { var discoverField = typeof(MerchantWSVO).GetField("discoverRetainedField", BindingFlags.NonPublic | BindingFlags.Instance); bool? discoverValue = (bool?)discoverField.GetValue(merchantVO); mt.overview.discoverRetained = discoverValue ?? false; mt.overview.discoverRetainedSpecified = discoverValue.HasValue; } } var myString = new System.IO.StringWriter(); var serializer = new XmlSerializer(classObject.GetType()); serializer.Serialize(myString, classObject); return myString.ToString(); }
注意事项
- 访问私有成员时,必须指定
BindingFlags.NonPublic | BindingFlags.Instance,否则反射无法定位目标字段。 - 由于
discoverRetainedField是Nullable<bool>,需做空值处理避免异常。 - 优先使用公共属性
overview而非私有字段overviewField,公共属性是第三方类对外的稳定契约,私有成员可能随版本变动。
内容的提问来源于stack exchange,提问作者gene
相关产品推荐
相关产品推荐

