如何在 C# 中更新数据类型的值

本文关键字:数据类型 更新 | 更新日期: 2023-09-27 17:56:25

我所有人,我的代码:

int a = 1;
int b = 2;
enum eType
{
    A,
    B
}

我有函数 UpdateValue 根据传递的参数 eType 更新 a 或 b 的值:

void UpdateValue(eType type, int value)
{
switch(type)
{
   case eType.A:
      a = value;
      break;
   case eType.B:
      b = value;
      break;
}
}

我还有函数 GetValue 根据传递的参数 eType 获取 a 或 b 的值

    int GetValue(eType type)
    {
    int result = 0;
    switch(type)
    {
        case eType.A:
          result  = a;
          break;
        case eType.B:
          result  = b;
          break;
    }
    return result;
    }

如果我在枚举 eType 中有很多项目,这个解决方案非常糟糕。我不喜欢必须取消 eType 中的项目列表。所以我有一个新的解决方案:我创建了一个字典:

Dictionary<eType, int> dict = new Dictionary<eType, int>();
dict[eType.A] =a;
dict[eType.B] =b;

我很容易从字典和eType中获取a或b的值。示例:为了获得 a 的值,我调用 dict[eType.A]。但是我如何更新基于 a 或 b 的字典和 eType 的值。

例如,如果我有dict[eType.A] containing the value 10

如何将变量 a 设置为 10。

(我想将 a 映射到 eType.A,并将 b 映射到 eType.B。我可以轻松地从字典中更新 a 和 b 的值。我可以更改使用字典的值。如何执行此操作。

我正在使用 .NET 4.0。

如何在 C# 中更新数据类型的值

你可以试试这个:

enum eType: int
{
    A=0,
    B=1
    //etc...
}
int count = Enum.GetValues(typeof(eType)).Length;
int[] values = new int[count];

然后你可以使用 values[(int)eType] 来获取和设置,其中变量 a 是值 [0],变量 b 是值 [1]。这个数组可以随心所欲地长,你应该添加代码,只是 eType 枚举中的条目......
只是一个合作的想法...

你有正确的想法。下面是一些创建字典并读取和更新它的代码。我希望这会有所帮助。

var dict = new Dictionary<string, int>();
dict.Add("a", 1);
dict.Add("b", 2);
var x = dict["a"];  // 1
dict["a"] = 10;
var y = dict["a"];  // 10

如果您无法控制需要设置的变量(否则主要解决方案实际上是用字典本身替换变量),那么我认为反射是自动化此行为的唯一方法。

变量和枚举值之间链接的可能解决方案是创建一个自定义属性,然后可以将其附加到枚举值,如下所示:

[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = false)]
sealed class MemberBindingAttribute : Attribute
{
    readonly string memberName;
    public MemberBindingAttribute(string memberName)
    {
        this.memberName = memberName;
    }
    public string MemberName
    {
        get { return memberName; }
    }
}
enum eType
{
    [MemberBinding("a")]
    A,
    [MemberBinding("b")]
    B
}

然后在UpdateValue()方法中查询这些属性,检索相应成员的FieldInfo(或PropertyInfo)并动态设置值。

但是,请注意,基于反射的解决方案确实会带来性能成本。

为什么不使用字典作为全局变量,而改用字符串键

的意思是如果我有 A 到 Z 的枚举,那么我也会有 26 个从 a 到 z 的变量,它们必须根据枚举的值进行更新。

好吧,这在字典中根本不可能。

反思可能很有用。如果你要更新的所有这些变量都是类的字段。

看看泛型,你可以定义一个 eType 列表作为键类型,int 作为值类型:

List<etype,int> myList = new List<etype,int>();

myList 包含执行所需操作的方法。