我想做一个类构造函数,它接受字典作为参数,并初始化字典中作为key列出的所有类变量,当然是在类型转换之后:
public class User
{
public int id;
public string username;
public string password;
public string email;
public int mana_fire;
public int mana_water;
public int mana_earth;
public int mana_life;
public int mana_death;
public User ()
{
}
public User(Dictionary<string,string> dataArray){
FieldInfo[] classVariablesInfoList = typeof(User).GetFields();
for(int i = 0; i < classVariablesInfoList.Length; i++)
{
if(dataArray.ContainsKey(classVariablesInfoList[i].Name)){
//missing code here :)
//need something like classVariable= dataArray["classVariablesInfolist[i].name"]; ?
}
}
}
}
但是我不知道该怎么做!你能帮帮我吗?:)
可以使用反射中的SetValue函数:
FieldInfo f = classVariablesInfoList[i];
if (f.ReflectedType == typeof(int))
{
f.SetValue(this, Convert.ToInt32(dataArray[f.Name]));
}
else
{
f.SetValue(this, dataArray[classVariablesInfoList[i].Name]);
}
但是在字典中这样做是非常少见的。您应该考虑直接访问字段或为任何字段的构造函数添加参数。而且字段永远不应该是公共的——使用属性代替。
如果Convert.ChangeType()
能够处理转换,下面将工作。有很多问题等着发生,例如处理字符串表示依赖于语言环境的数字或日期。如果可能的话,我建议使用通常的类型化构造函数参数或标准(反)序列化机制。或者至少使用包含对象而不是字符串的字典来避免转换,如果可能的话。
public User(Dictionary<String, String> data)
{
var fields = typeof(User).GetFields();
foreach (field in fields)
{
if (data.ContainsKey(field.Name))
{
var value = Convert.ChangeType(data[field.Name], field.MemberType);
field.SetValue(this, value);
}
}
}
我想把你的问题分成两部分。
<标题> 1。应用转换 FieldInfo类型提供了一个FieldType
属性,它是字段的实际类型,使用这个Type
我们可以使用System.Convert
的非泛型ChangeType方法,该方法可以将一些类型转换为其他类型。幸运的是它支持String to Int
。用法:
Convert.ChangeType(OLD_VALUE, TARGET_TYPE);
<标题> 2。设置字段字段信息类有一个SetValue
方法(FieldInfo.SetValue),它有两个参数,第一个是当前(即。此)实例(或您希望更改的实例)。第二个是您希望设置的新值。
把它们放在一起
[...]
var fieldInfo = classVariablesInfoList[i];
var name = fieldInfo.Name;
var targetType = fieldInfo.Type;
var value = Convert.ChangeType(dataArray[name], targetType);
classVariablesInfoList[i].SetValue(this, value);
标题>标题>