You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过反射获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:42:02