2014-05-10 170 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); 
     } 
    } 
}