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

C#嵌套结构体迭代问题:如何通过字段访问并打印所有成员

嘿,我来帮你搞定这个嵌套结构体成员打印的问题!首先得先把你的结构体定义调整对——原代码里struct a直接写public struct b;这种写法是语法错误的,应该是在父结构体里定义嵌套结构体,或者让父结构体包含这些嵌套结构体类型的字段实例,不然根本没法访问成员。我给你调整成正确的嵌套结构体写法:

// 父结构体A,里面包含嵌套结构体B、C
public struct A
{
    // 嵌套结构体B的定义
    public struct B
    {
        public int b1;
        public int b2;

        // 结构体的构造函数(因为结构体不能在字段声明时直接赋值,得用构造函数或者实例化后赋值)
        public B(int b1, int b2)
        {
            this.b1 = b1;
            this.b2 = b2;
        }
    }

    // 嵌套结构体C的定义
    public struct C
    {
        public string c1;
        public bool c2;
    }

    // A的字段:包含嵌套结构体B和C的实例
    public B MyBInstance;
    public C MyCInstance;
}

注意哦,C#里结构体是值类型,旧版本不允许在字段声明时直接给默认值(比如public int b1 = 1;),用构造函数初始化更稳妥,新版本虽然支持字段默认值,但构造函数的兼容性更好。

接下来,咱用反射来实现一个通用的打印方法,不管是普通字段还是嵌套结构体,都能递归遍历打印出来。反射可以帮我们动态获取类型的字段信息,完美解决你不知道怎么访问嵌套结构体的问题:

using System;
using System.Reflection;

public static class StructPrinter
{
    public static void PrintAllMembers(object structInstance, string parentPath = "")
    {
        if (structInstance == null) return;

        Type structType = structInstance.GetType();

        // 如果是基础值类型(int、bool等)或字符串,直接打印值
        if (structType.IsPrimitive || structType == typeof(string))
        {
            Console.WriteLine($"{parentPath} = {structInstance}");
            return;
        }

        // 打印当前结构体的名称(带父路径)
        string fullStructName = string.IsNullOrEmpty(parentPath) 
            ? structType.Name 
            : $"{parentPath}.{structType.Name}";
        Console.WriteLine($"struct {fullStructName}");

        // 获取结构体的所有公共实例字段
        FieldInfo[] fields = structType.GetFields(BindingFlags.Public | BindingFlags.Instance);
        foreach (FieldInfo field in fields)
        {
            object fieldValue = field.GetValue(structInstance);
            string fieldPath = $"{fullStructName}.{field.Name}";

            // 如果字段是结构体(且不是基础类型),递归打印它的成员
            if (field.FieldType.IsValueType && !field.FieldType.IsPrimitive && field.FieldType != typeof(string))
            {
                PrintAllMembers(fieldValue, fieldPath);
            }
            else
            {
                // 普通字段直接打印名称和值
                Console.WriteLine($"{fieldPath} = {fieldValue}");
            }
        }
    }
}

现在来测试一下这个方法,创建结构体实例并调用打印:

class Program
{
    static void Main()
    {
        // 初始化嵌套结构体实例
        A myA = new A
        {
            MyBInstance = new A.B(1, 2),
            MyCInstance = new A.C { c1 = "Test String", c2 = true }
        };

        // 打印所有成员
        StructPrinter.PrintAllMembers(myA);
    }
}

运行后你会得到这样的输出:

struct A
A.MyBInstance = struct A.B
A.B.b1 = 1
A.B.b2 = 2
A.MyCInstance = struct A.C
A.C.c1 = Test String
A.C.c2 = True

这个方法的逻辑很简单:

  • 先判断当前对象是不是基础类型,是就直接打印值
  • 如果是结构体,先打印结构体的完整名称
  • 遍历结构体的所有公共字段,字段如果是嵌套结构体就递归调用打印方法,否则直接打印字段名和值

这样不管你嵌套多少层结构体,都能把所有成员都打印出来啦!

内容的提问来源于stack exchange,提问作者TC code

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:18:15