2014-05-10 123 views
0

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


       } 
      } 
     } 

    } 

,但我可以”找出如何做到这一点! 你能帮忙吗? :)

+1

你可以这样做。但为什么?为什么不直接使用构造函数中定义的所有必需参数访问该字段? –

+0

您可以使用反射来实现这一点。请参阅http://stackoverflow.com/questions/1965635/c-sharp-reflection-changing-the-value-of-a-field-of--variable – Tarik

+0

我想有一个不需要的构造函数当类变量定义更改时更新 – Romeo

回答

0

可以使用的SetValue frunction从反思:

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

但它是一个字典做这个一个非常罕见的方式。您应该考虑直接访问字段或向任何字段的构造函数添加参数。而且域不应该是公共的 - 使用属性来代替。

+0

这不起作用,因为字典仅包含字符串,但某些字段是其他类型的字段。你必须包含某种类型的转换,这在一般情况下可能会变得很难看。 –

+0

如果f?我可以在这里进行类型转换吗? – Romeo

+0

@DanielBrückner:谢谢,我改了它 –

0

我想将问题分为两部分。

1.申请转换

的字段信息类型存在于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); 
+0

这不起作用,因为字典只包含字符串,但有些字段是其他类型的字段。你必须包含某种类型的转换,这在一般情况下可能会变得很难看。 –

+0

@DanielBrückner哦,对了,我很习惯这种使用对象的类型初始化,所以我没有注意到。 –

+0

您有错误顺序的'Convert.ChangeType()'的参数。 –

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