2013-01-24 51 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); 

虽然你没有得到编译时类型检查。