C#:如何创建并引用多全局可访问对象以避免多层条件判断
解决方案
核心思路
把独立的静态内部类重构为统一类型的实例,用集合(数组/字典)存储并通过编号映射,直接通过编号访问目标对象,彻底消除多层if/else。
步骤1:定义统一的Foo类
替代原来各自独立的Foo1/Foo2静态内部类,让所有Foo对象拥有相同类型:
public class Foo { public int TestInt { get; set; } public string TestString { get; set; } }
步骤2:用静态集合管理所有Foo实例
创建静态容器类,初始化并存储10个Foo实例,编号直接对应集合索引(或字典Key):
public static class TestClassProperties { // 数组索引1-10对应编号1-10,索引0闲置 public static readonly Foo[] Foos = new Foo[11]; static TestClassProperties() { // 初始化10个Foo实例 Foos[1] = new Foo { TestInt = 1, TestString = "Hello" }; Foos[2] = new Foo { TestInt = 2, TestString = "Hi" }; Foos[3] = new Foo { TestInt = 3, TestString = "Hey" }; // 继续初始化Foos[4]到Foos[10],按需求设置初始值 } }
如果偏好字典(更灵活支持非连续编号),可以改成:
public static class TestClassProperties { public static readonly Dictionary<int, Foo> Foos = new Dictionary<int, Foo>(); static TestClassProperties() { Foos.Add(1, new Foo { TestInt = 1, TestString = "Hello" }); Foos.Add(2, new Foo { TestInt = 2, TestString = "Hi" }); Foos.Add(3, new Foo { TestInt = 3, TestString = "Hey" }); // 添加到编号10 } }
步骤3:简化PressKey方法
直接通过编号访问集合中的Foo实例,读写属性:
public class CallTestClass { string bar; void PressKey(int numberPressed) { // 数组版本:检查编号是否在有效范围 if (numberPressed is >= 1 and <= 10 && TestClassProperties.Foos[numberPressed] != null) { var targetFoo = TestClassProperties.Foos[numberPressed]; bar = targetFoo.TestString; targetFoo.TestString = "Goodbye"; } else { bar = "Nothing."; } Console.WriteLine("You said " + bar); } }
字典版本用TryGetValue更安全:
void PressKey(int numberPressed) { if (TestClassProperties.Foos.TryGetValue(numberPressed, out var targetFoo)) { bar = targetFoo.TestString; targetFoo.TestString = "Goodbye"; } else { bar = "Nothing."; } Console.WriteLine("You said " + bar); }
全局访问支持
因为TestClassProperties是静态类,代码任意位置都可以直接读写指定Foo的属性:
// 读取Foo5的TestInt int value = TestClassProperties.Foos[5].TestInt; // 修改Foo7的TestString TestClassProperties.Foos[7].TestString = "New Value";
备注(若无法重构原有静态类)
如果因特殊原因不能修改原有Foo1/Foo2等静态内部类,可以用反射实现,但反射性能较低,仅作备选:
public static class TestClassProperties { public static readonly Dictionary<int, Type> FooTypes = new Dictionary<int, Type> { {1, typeof(TestClassProperties.Foo1)}, {2, typeof(TestClassProperties.Foo2)}, // 加到10 }; } // 使用示例 void PressKey(int numberPressed) { if (TestClassProperties.FooTypes.TryGetValue(numberPressed, out var fooType)) { // 读取TestString var prop = fooType.GetProperty("TestString"); bar = (string)prop.GetValue(null); // 设置TestString prop.SetValue(null, "Goodbye"); } else { bar = "Nothing."; } }
内容的提问来源于stack exchange,提问作者Xebarsis
相关产品推荐
相关产品推荐

