【问题标题】:C# call a const using a variable that matches the const nameC# 使用与 const 名称匹配的变量调用 const
【发布时间】:2017-09-20 13:41:59
【问题描述】:

我有一组 const,然后我动态创建一个变量,该变量等于其中一个 const 名称。我需要调用那个 const,我知道我可以使用 if else 语句,但我想知道是否有更好的方法谢谢!

    public const int LifeBand1Standard = 78;
    public const int LifeBand1Multi = 61;
    public const int LifeBand2Standard = 71;
    public const int LifeBand2Multi = 56;
    public const int LifeBand3Standard = 62;
    public const int LifeBand3Multi = 48;
    public const int LifeBand4Standard = 56;
    public const int LifeBand4Multi = 44;
    public const int LifeBand5Standard = 45;
    public const int LifeBand5Multi = 35;

    // Band discounts/loads for trauma cover
    public const int TraumaBand1Standard = 140;
    public const int TraumaBand1Multi = 126;
    public const int TraumaBand2Standard = 135;
    public const int TraumaBand2Multi = 121;
    public const int TraumaBand3Standard = 121;
    public const int TraumaBand3Multi = 109;
    public const int TraumaBand4Standard = 110;
    public const int TraumaBand4Multi = 99;
    public const int TraumaBand5Standard = 100;
    public const int TraumaBand5Multi = 90;

    protected float GetPercentageFromBand(int band)
    {
        var constantName = "Life";

        if (IsTraumaCover == true)
        {
            constantName = "Trauma";
        }

        constantName += "Band" + band;

        if (IsMultiLife == true)
        {
            constantName += "Multi";
        }
        else
        {
            constantName += "Standard";
        }

        // Constant should look something like LifeBand3Standard and will return the value of the const LifeBand3Standard
        BandPercentage = InsuranceBandFetcher.constantName;

    }

【问题讨论】:

  • 不,您不能以这种方式访问​​变量
  • 改用Dictionary
  • @L.B 我对 c# 很陌生,我如何使用字典来做到这一点?
  • 为什么不创建一个枚举和其他人所说的使用字典
  • 如果需要保留const的设计,可以使用反射:typeof(InsuranceBandFetcher).GetField(constantName).GetRawConstantValue();

标签: c# oop constants var


【解决方案1】:

使用enum 加上Dictionary 类似下面的东西(只是一个示例代码)

public enum MyConstant
{
    LifeBand1Standard = 78,
    LifeBand1Multi = 61,
    LifeBand2Standard = 71,
    LifeBand2Multi = 56,
    LifeBand3Standard = 62,
    LifeBand3Multi = 48
}

将数据保存在字典中

        Dictionary<string, MyConstant> dict = new Dictionary<string, MyConstant>
        {
            { "TraumaCover ", MyConstant.LifeBand3Multi},
            { "MultiLife ", MyConstant.LifeBand2Standard}
        };

        Console.WriteLine(dict["MultiLife "]);

根据您的评论,另一个示例代码。您可以为此目的使用Enum.Parse(),例如

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            string key = PrepareConstant(1, false);
            MyConstant val = (MyConstant)Enum.Parse(typeof(MyConstant), key, true);

            Dictionary<string, MyConstant> dict = new Dictionary<string, MyConstant>
            {
                { key, val},
            };

            Console.WriteLine(dict[key]); // output: LifeBand1Standard

            Console.ReadKey();
        }

        static string PrepareConstant(int band, bool isMultiLife)
        {
            var constantName = "Life";
            constantName += "Band" + band;
            constantName += (isMultiLife) ?  "Multi" : "Standard";

            return constantName;
        }
    }

    public enum MyConstant
    {
        LifeBand1Standard = 78,
        LifeBand1Multi = 61,
        LifeBand2Standard = 71,
        LifeBand3Standard = 62,
        TrumaBand2Multi = 56,
        TrumaBand3Multi = 48
    }
}

【讨论】:

  • 很抱歉,这可能是一个非常愚蠢的问题,但是我如何在我的上下文中使用它,因为我动态地构建了 constantName 那么它是如何工作的,所以我可以根据其他人获得正确的值?
  • 为了保持const 字段的“只读”性质,可能需要使用IReadOnlyDictionary&lt;string, MyConstant&gt; dict = new ReadOnlyDictionary&lt;string, MyConstant&gt;(new Dictionary&lt;string, MyConstant&gt; { [...] }); --- 同时仍然能够使用dict[constantName]
【解决方案2】:

使用字典,而不是魔术字符串(尤其是那些以编程方式创建的字符串)。

我不了解您的业务领域,因此我的枚举名称/值可能非常奇怪,但这是我解决问题的方法:

public enum Cover
{
    Life,
    Trauma
}

public enum MultiLife
{
    Multi,
    Standard
}

public readonly Dictionary<Tuple<Cover, int, MultiLife>, int> Values
 = new Dictionary<System.Tuple<UserQuery.Cover, int, UserQuery.MultiLife>, int>
 {
    [Tuple.Create(Cover.Life, 1, MultiLife.Standard)] = 78,
    [Tuple.Create(Cover.Life, 1, MultiLife.Multi)] = 61,
    [Tuple.Create(Cover.Life, 2, MultiLife.Standard)] = 71,
    // [...]
 };

那么用法是:

var bandPercentage
 = Values[Tuple.Create(IsTraumaCover ? Cover.Trauma : Cover.Life,
                       band,
                       IsMultiLife ? MultiLife.Multi : MultiLife.Standard)];

【讨论】:

    【解决方案3】:

    如果没有反思,您将尝试做的事情是不可能的。即使有反射,这也不是推荐的设计。

    您似乎想要的是一个从三个值映射的函数: 1. 多或标准(布尔或枚举)。 2. 生命或创伤(布尔或枚举)。 3.数字(int)(或字节,或自定义结构) 并返回某种数字(百分比?)。

    enum BandKind {
     Multi,
     Standard,
    }
    
    enum BandType {
     Life,
     Trauma
    }
    
    int GetBandValue(BandKind kind, BandType type, int num) {
    
    /// impl here
    }
    

    好的,那么如何实现GetBandValue?您可以使用嵌套的 switch 语句并返回文字值,这将是一种选择,但嵌套的 switch 最终会变得有点难看。您可以创建一个多维数组并使用这些值对其进行索引。

    int[][][] BandData = {{{78, 61},{71, 56},...}}}; // build this array with your real values.
    

    那么你的实现可以是:

    int GetBandValue(BandKind kind, BandType type, int num) {
    
        return BandData[(int)kind][(int)type][num];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-26
      • 1970-01-01
      • 2011-09-16
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多