2013-01-24 73 views
2

而不是做一個類構造函數的重載,我想通過Dictionary來動態設置變量。使用字典鍵(作爲字符串)在構造函數中設置變量

// Class definition 
public class Project 
{ 
    public DateTime LastModified; 
    public string LoanName; 
    public string LoanNumber; 
    public int LoanProgram; 
    public string ProjectAddress; 
    ... 

    // Project class constructor 
    public Project(Dictionary<string, object> Dict) 
    { 
     foreach (KeyValuePair<string, object> entry in Dict) 
     { 
      // ie, when the Key is "LoanName", this.LoanName is set 
      this.(entry.Key) = entry.Value; // <-- Does not compile, obviously 
     } 
    } 
} 

// application code 
... 
Dictionary<string, object> dict = new Dictionary<string,object>(); 
dict.Add("LoanName", "New Loan Name"); 
dict.Add("LoanProgram", 1); 
dict.Add("ProjectAddress", "123 Whatever Way"); 
Project p = new Project(dict); 
... 

在構造函數中,有沒有什麼方法可以使用Dictionary Key(一個字符串)來確定要設置的類成員?這可以用反射來完成嗎?

+3

這聽起來非常愚蠢。 – Pubby

+3

這對你有什麼好處?你必須用特定的鍵和值填充一個字典,然後把它作爲參數傳遞給構造函數,並找出如何使用它。爲什麼不傳遞價值觀呢? –

+3

或者,對於這個問題使用'對象初始值設定項'。 –

回答

2
public class Project 
{ 
    public DateTime LastModified; 
    public string LoanName; 
    public string LoanNumber; 
    public int LoanProgram; 
    public string ProjectAddress; 
    ... 

    // Project class constructor 
    public Project(Dictionary<string, object> Dict) 
    { 
     foreach (KeyValuePair<string, object> entry in Dict) 
     { 
      this.GetType().GetProperty(entry.Key).SetValue(this, entr.Value, null); 
     } 
    } 
} 
+0

值得注意的是,使用反射會導致性能損失。當然這不是一種無效的方法,但是應該讓結果知道。 – cdhowie

+1

然後,當然你需要處理不存在的成員的字典密鑰,不公開,不是正確的類型,是靜態的,等等。 – Servy

+0

對,但是cdhowie已經給出了正確的答案,只是一個關於「我們如何通過屬性名稱設置屬性值」的技巧。他可以檢查所有案件,並就此發現異常情況。只是一個例子。 –

11

該字段已公開...爲什麼不只是使用對象初始化語法?

var p = new Project() { 
    LoanName = "New Loan Name", 
    LoanProgram = 1, 
    ProjectAddress = "123 Whatever Way" 
}; 
+0

+1:同樣的結果,比填寫字典更少的努力... –

+3

雖然,你真的不應該有公共領域... – Servy

+2

@Servy同意。雖然初始化方法將與字段和屬性相同。 – cdhowie

0

我會建議尋找到默認參數。

例如

public Project(loanName = null, lastModified = null, loanNumber = null, loanProgram = 0, projectAddress = null) 
{ 
    //Set them in here 
} 

我也建議使用公共屬性,而不是公共領域。 例如

public DateTime LastModified { get; private set; } //Makes it so only inside the class LastModified can be set 
1

這看起來像一個維修噩夢,但你可以這樣查看屬性。

var prop = typeof(Project).GetProperty(entry.Key); 

然後你可以設置這樣的值。

prop.SetValue(this, entry.Value); 

雖然你沒有得到編譯時類型檢查。