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

C#中如何通过变量值直接访问类的同名属性,无需使用switch语句?

方案1:反射实现(最贴近JS动态访问的写法,实现简单)

你可以通过C#的反射API,用字符串属性名直接获取/修改对象的属性值,代码实现如下:

private static void CalculateOrder(Order order, Order offer, bool isBuy, string coin)
{
    var sign = isBuy ? 1 : -1;
    var changedValue = sign * order.Amount;
    
    // 获取Wallet类型的属性信息
    var property = typeof(Wallet).GetProperty(coin);
    // 校验属性是否存在,避免非法coin参数报错
    if (property == null || property.PropertyType != typeof(decimal))
        throw new ArgumentException($"无效的币种类型:{coin}", nameof(coin));
    
    // 给order用户的对应币种加余额
    var orderWallet = order.ApplicationUser.Wallet;
    var currentOrderVal = (decimal)property.GetValue(orderWallet);
    property.SetValue(orderWallet, currentOrderVal + changedValue);
    
    // 给offer用户的对应币种减余额
    var offerWallet = offer.ApplicationUser.Wallet;
    var currentOfferVal = (decimal)property.GetValue(offerWallet);
    property.SetValue(offerWallet, currentOfferVal - changedValue);
}

这个方案代码量小,不需要提前做额外配置,适合调用频次不高的场景。

方案2:预构建访问委托字典(高性能版,适合高频交易场景)

反射每次调用都有固定的性能开销,如果你的CalculateOrder是高频调用的交易核心逻辑,建议提前把所有币种的属性访问委托缓存到静态字典中,调用性能和原生硬编码的switch case几乎一致:

// 静态缓存字典,key是币种名,value是修改Wallet对应属性值的委托
private static readonly Dictionary<string, Action<Wallet, decimal>> _coinPropertySetter = new();

// 静态构造函数,程序启动时一次性初始化所有币种的访问委托
static YourClassName() // 这里替换成你这个方法所在类的类名
{
    var walletType = typeof(Wallet);
    // 遍历所有Wallet里的decimal类型币种属性
    var coinProperties = walletType.GetProperties()
        .Where(p => p.PropertyType == typeof(decimal));
    foreach (var prop in coinProperties)
    {
        Action<Wallet, decimal> setter = (wallet, value) => 
        {
            var current = (decimal)prop.GetValue(wallet);
            prop.SetValue(wallet, current + value);
        };
        _coinPropertySetter.TryAdd(prop.Name, setter);
    }
}

// 修改后的CalculateOrder方法
private static void CalculateOrder(Order order, Order offer, bool isBuy, string coin)
{
    if (!_coinPropertySetter.TryGetValue(coin, out var setter))
        throw new ArgumentException($"无效的币种类型:{coin}", nameof(coin));
    
    var sign = isBuy ? 1 : -1;
    var changedValue = sign * order.Amount;
    
    setter(order.ApplicationUser.Wallet, changedValue);
    setter(offer.ApplicationUser.Wallet, -changedValue);
}

其他可选方案(不推荐)

你也可以用dynamic关键字实现类似JS的写法,但该写法没有编译期类型校验,出错概率高,性能也没有优势,不建议在生产环境使用。

内容的提问来源于stack exchange,提问作者MohanmadJavad Jamali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:54:00