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

C#调用ToString()返回对象类型而非实际值该如何解决?

问题根因

  1. 遍历逻辑错误:你内层通过反射遍历了PaidTrip类的所有属性,而非只获取LicenseHolderID属性的值,当遍历到类中类型为Action的属性时,对该属性值调用ToString()自然会返回System.Action1[System.Action]`类型字符串,这就是你PDF里输出内容的来源。
  2. 变量命名混乱:你外层ObservableCollection实例命名为PaidTrips,内层遍历theseTrips时的单个PaidTrip实体循环变量也命名为PaidTrips,且反射属性的循环变量直接取名为LicenseHolderID,多重命名混淆直接导致你逻辑判断出错。断点能看到正确值是因为你刚好停在遍历到LicenseHolderID属性的那次循环,后续遍历到其他属性时覆盖了变量n的值,最终写入PDF的是最后一次循环得到的类型字符串。
  3. 空值风险:你没有对反射获取的属性值做空判断,如果属性值为null时调用ToString()会直接抛出空引用异常。

解决方案

方案1:无需反射,直接访问属性(推荐)

你明确需要的是LicenseHolderID属性的值,完全不需要用反射遍历所有属性,直接修改内层循环代码即可:

// 先修改循环变量名,避免和外层集合重名
foreach (PaidTrip trip in theseTrips) 
{
    // 直接访问属性拿值,不需要反射
    string n = trip.LicenseHolderID;
    // 后续写PDF的逻辑
    gfx.DrawString(n, new XFont("Arial", 40, XFontStyle.Bold), ridelGreen, new XPoint(40, 350));
}

方案2:确实需要遍历所有属性的处理方式

如果你有遍历所有属性输出的需求,需要过滤目标属性并添加空值判断:

foreach (PaidTrip trip in theseTrips) 
{
    foreach (var prop in trip.GetType().GetProperties()) 
    {
        // 只处理你需要的目标属性,避免遍历到无关的Action类型属性
        if (prop.Name == nameof(PaidTrip.LicenseHolderID))
        {
            object value = prop.GetValue(trip);
            // 做空判断,避免空引用异常
            string n = value?.ToString() ?? string.Empty;
            // 写PDF逻辑
            gfx.DrawString(n, new XFont("Arial", 40, XFontStyle.Bold), ridelGreen, new XPoint(40, 350));
        }
    }
}

内容的提问来源于stack exchange,提问作者Ole M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:54:03