如何在 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。
你可以试试这个:
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 包含执行所需操作的方法。