我可以用另一个变量访问一个类变量吗?



我想做一个类构造函数,它接受字典作为参数,并初始化字典中作为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);

相关内容

  • 没有找到相关文章

最新更新