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

C#如何通过变量名获取struct结构体字段值并校验字段是否存在

解决方案

错误原因说明

你之前得到System.String string1的输出,是因为GetField()返回的是字段元数据对象FieldInfo,直接返回该对象时默认会调用它的ToString()方法,输出的是字段的类型和名称,而非字段存储的实际值。同时你的代码还存在变量作用域、拼写、参数未使用的问题:

  • mystruct是SetStruct方法内的局部变量,GetStingfromStruct方法无法直接访问,需要将其提升为类的全局字段
  • 返回值类型sting拼写错误,应为string
  • 方法内硬编码了字段名"string1",没有使用传入的variableName参数

修复后代码

using System;
using System.Reflection;

public class TestClass
{
    // 将结构体实例提升为类字段,跨方法可访问
    private Mystruct mystruct;
    
    private void SetStruct()
    {
        mystruct = new Mystruct();
        mystruct.string1 = "asdf";
        mystruct.string2 = "ghjkl";
        mystruct.string3 = "qwert";
    }

    private string GetStringFromStruct(string variableName)
    {
        // 获取对应名称的公共实例字段
        FieldInfo field = typeof(Mystruct).GetField(variableName);
        
        // 校验字段是否存在,不存在可自定义处理逻辑避免运行报错
        if (field == null)
        {
            // 此处可根据需求修改为返回空字符串、返回默认值等逻辑
            throw new ArgumentException($"结构体中不存在名为 {variableName} 的字段");
        }
        
        // 传入结构体实例,获取字段实际存储的值
        return field.GetValue(mystruct) as string;
    }

    public struct Mystruct
    {
        public string string1;
        public string string2;
        public string string3;
    }
}

字段存在性校验方法

你直接通过GetField()的返回值即可判断字段是否存在:如果返回值为null,说明结构体中没有对应名称的公共实例字段,提前判断处理即可避免后续的运行错误。如果需要校验非公开字段,可以给GetField添加绑定标识参数:
FieldInfo field = typeof(Mystruct).GetField(variableName, BindingFlags.Instance | BindingFlags.NonPublic);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:06:04