C# 使用与常量名称匹配的变量调用 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;
}

使用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
}
}

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

我不了解您的业务领域,所以我的枚举名称/值可能完全奇怪,但这是我解决问题的方法:

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)];

没有反思,你试图做的事情是不可能的。即使有反射,也不是推荐的设计。

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

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

好的,那么如何实现GetBandValue呢?您可以使用嵌套开关语句并返回文字值,这将是一个选项,但嵌套开关最终变得有点丑陋。您可以创建一个多维数组并使用这些值索引到其中。

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];
}

最新更新