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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:24:04