我想要初始化很多键/值对。这些对分别存储在字段 Key 和字段 Value 中的数据库中。在一个类中,我有一些类变量(例如):
private double _A = 10;
private double _B = 20;
我想使用像这样的词典:
Dictionary<string, double> pairs = new Dictionary<string, double>() { {"A", _A}, {"B", _B} };
这样我就可以使用:
foreach( KeyValuePair<string, double> pair in pairs.toList() )
{
pairs[pair.key] = GetValueFromDB(pair.key);
}
我希望类变量将更新为新值。显然它没有用。我知道根本问题是它是double不是引用类型。我确实尝试使用对象,认为拳击会给我一个值的参考。它也没用。
我的问题是:在不使用类似的东西的情况下初始化这些类变量的最简单方法是什么:
double tempValue;
tempValue = GetValueFromDB("A");
if (HasValueInDB("A"))
{
_A = GetValueFromDB("A");
}
else
{
InsertValueToDB("A", _A);
}
因为我有大约40个类变量,我认为这很笨拙。
编辑:一个完整的代码:
private double _A=10;
private double _B=20;
public MainWindow()
{
Dictionary<string, double> pairs = new Dictionary<string, double>() { { "A", _A }, { "B", _B } };
InitializeComponent();
Console.WriteLine("Before: " + _A);
foreach (KeyValuePair<string, double> pair in pairs.ToList())
{
pairs[pair.Key] = GetValueFromDB(pair.Key);
}
Console.WriteLine("After: " + _A); // expect _A to be 50, but it's still 10
}
private double GetValueFromDB(string key)
{
return 50;
}
答案 0 :(得分:0)
好吧,我没有提出任何其他使用反射的解决方案。首先,将您的字段推送到某个类,您可以创建实例并按照您的意愿使用它。我将它们公之于众,只是为了便于打印,随意让它们变得私密。
class SomeValues
{
public double _A = 10;
public double _B = 20;
public FieldInfo[] GetMyFields()
{
return GetType().GetFields();
}
}
如果您将其设为私有,则必须将返回行更改为
GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
创建该类的实例。
SomeValues values = new SomeValues();
如果您的字段名称与数据库中的名称匹配,那么此方法就足够了。要从db更新值,只需调用
foreach (var field in values.GetMyFields())
{
var dbValue = GetValueFromDB(field.Name);
field.SetValue(values, dbValue);
}
我认为这比制作一个包含50个条目的字典要清楚得多,这些条目甚至不起作用,因为double
是一个值类型,并且是通过值传递的,而不是引用。