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
相关产品推荐
相关产品推荐

