在C#中如何存储对象值并实现类的动态访问?
错误原因
你之前的尝试失败的核心原因是:C#是静态类型语言,元组和静态类的成员都是编译时确定的绑定关系,不支持JavaScript中那种通过字符串变量用方括号语法动态访问成员的特性。JS对象本质是动态键值对集合,但C#的元组、类成员属于固定的编译期元素,方括号语法在这里不适用。
推荐实现方案
方案1:字典+强类型结构(最贴近JS写法)
先定义一个封装操作属性的类型(C# 9+推荐用record,更简洁),再用Dictionary<string, Operation>存储键值对,完美匹配你需要的动态访问需求:
// 用record定义操作结构(C# 9及以上支持) public record Operation(string Key, string Desc, string Response); // 作为静态属性初始化,全局可访问 public static readonly Dictionary<string, Operation> Operations = new() { ["a"] = new Operation("a", "Add", "+"), ["s"] = new Operation("s", "Subtract", "-"), ["m"] = new Operation("m", "Multiply", "*"), ["d"] = new Operation("d", "Divide", "/") }; // 动态访问示例 string currentOp = "a"; string description = Operations[currentOp].Desc;
如果使用C# 8及以下版本,将record替换为普通类即可:
public class Operation { public string Key { get; } public string Desc { get; } public string Response { get; } public Operation(string key, string desc, string response) { Key = key; Desc = desc; Response = response; } }
方案2:自定义类+索引器(兼顾点语法与动态访问)
如果想保留类的使用形式,同时支持方括号动态访问,可以给自定义类添加索引器,还能同时保留点语法访问的便利性:
public class Operations { private readonly Dictionary<string, Operation> _internalOps = new() { ["a"] = new Operation("a", "Add", "+"), ["s"] = new Operation("s", "Subtract", "-"), ["m"] = new Operation("m", "Multiply", "*"), ["d"] = new Operation("d", "Divide", "/") }; // 自定义索引器,支持字符串键动态访问 public Operation this[string key] => _internalOps[key]; // 保留点语法访问的成员 public Operation A => _internalOps["a"]; public Operation S => _internalOps["s"]; public Operation M => _internalOps["m"]; public Operation D => _internalOps["d"]; } // 使用示例 var ops = new Operations(); string currentOp = "a"; string dynamicDesc = ops[currentOp].Desc; // 动态访问 string directDesc = ops.A.Desc; // 点语法访问
关于ExpandoObject
ExpandoObject确实支持动态访问,但它依赖dynamic关键字,会失去C#的静态类型检查优势,而且初始化无法像字典那样简洁完成,对于你这种结构固定的静态数据场景,强类型字典的方案更合适。
内容的提问来源于stack exchange,提问作者Kelderic
相关产品推荐
相关产品推荐

