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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:26:20