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

时间:2014-05-10 14:18:33

标签: c# class variables reflection

我想做一个类构造函数,它将一个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"]; ?


                }
            }
        }

    }

但我无法知道如何做到这一点! 你能帮忙吗? :)

3 个答案:

答案 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)

我想将您的问题分成两部分。

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);

答案 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);
      }
   }
}