C#如何根据编译期未知的属性名称字符串获取或修改对应属性值
方案说明
你想要的「根据字符串返回字段引用」的需求可以实现,更推荐你提到的public void MagicFunction(string value, int newvalue)实现形式,逻辑更简单、兼容性也更强。
实现1:返回字段引用(ref int形式,C#7.0+支持)
你需要的nameof反向功能可以通过反射+ref返回实现,代码示例如下:
public class Savesettings { public int alpha, beta, gamma, up, down, right, left; public ref int MagicFunction(string value) { var fieldInfo = typeof(Savesettings).GetField(value); if (fieldInfo == null) throw new ArgumentException($"未找到名为{value}的字段", nameof(value)); // 通过反射获取字段引用返回 return ref fieldInfo.GetValueDirect(__makeref(this)).Unbox<int>(); } }
使用方式:
var settings = new Savesettings(); settings.MagicFunction("alpha") = 99; // 直接给alpha赋值 Console.WriteLine(settings.alpha); // 输出99
注意:该方案用到了__makeref这类底层语法,兼容性有限,仅适合你明确运行环境的场景使用
实现2:直接赋值形式(更推荐)
就是你提到的第二种接口形式,兼容所有.NET版本,逻辑更安全:
public class Savesettings { public int alpha, beta, gamma, up, down, right, left; public void MagicFunction(string value, int newValue) { var fieldInfo = typeof(Savesettings).GetField(value); if (fieldInfo == null) throw new ArgumentException($"未找到名为{value}的字段", nameof(value)); fieldInfo.SetValue(this, newValue); } }
使用方式:
var settings = new Savesettings(); settings.MagicFunction("beta", 100); Console.WriteLine(settings.beta); // 输出100
性能优化建议
如果这个方法会被高频调用,可以提前缓存反射结果减少性能损耗:
- 静态构造函数里把所有字段的
FieldInfo预存到字典中 - 调用时直接从字典取对应信息操作,性能会提升数倍
内容的提问来源于stack exchange,提问作者AnProg
相关产品推荐
相关产品推荐

