我想做一个类构造函数,它将一个dicionary作为参数并初始化所有在字典中列为键的类变量,当然是类型转换之后:
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"]; ?
}
}
}
}
但我无法知道如何做到这一点! 你能帮忙吗? :)
答案 0 :(得分:0)
您可以使用反射中的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]);
}
但是用字典做这个是一种非常罕见的方法。您应该考虑直接访问字段或将参数添加到任何字段的构造函数中。字段永远不应该是公共的 - 而是使用属性。
答案 1 :(得分:0)
我想将您的问题分成两部分。
FieldInfo类型提供FieldType
属性,该属性是字段的实际类型,使用此Type
我们可以使用System.Convert
的非通用ChangeType方法,这种方法可以将某些类型转换为其他类型。幸运的是它支持String to Int
。
用法:
Convert.ChangeType(OLD_VALUE, TARGET_TYPE);
字段信息类有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);
答案 2 :(得分:0)
如果Convert.ChangeType()
能够处理转化,则以下内容将有效。等待发生的问题很多,例如处理字符串表示取决于语言环境的数字或日期。我建议使用通常的类型构造函数参数或标准(de)serialization mechanism。或者至少使用包含对象而不是字符串的字典来消除转换,如果可能的话。
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);
}
}
}