Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用字典键(作为字符串)在构造函数中设置变量_C#_Reflection - Fatal编程技术网

C# 使用字典键(作为字符串)在构造函数中设置变量

C# 使用字典键(作为字符串)在构造函数中设置变量,c#,reflection,C#,Reflection,我希望传入一个字典来动态设置变量,而不是对类构造函数进行大量重载 // Class definition public class Project { public DateTime LastModified; public string LoanName; public string LoanNumber; public int LoanProgram; public string ProjectAddress; ... // Proj

我希望传入一个
字典来动态设置变量,而不是对类构造函数进行大量重载

// 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);
...
//类定义
公共类项目
{
上次修改的公共日期时间;
公共字符串借名;
公共字符串LoanNumber;
公共国际贷款计划;
公共字符串地址;
...
//项目类构造函数
公共项目(字典目录)
{
foreach(Dict中的KeyValuePair条目)
{
//即,当键为“LoanName”时,此.LoanName已设置

this.(entry.Key)=entry.Value;//这些字段已经是公共的了……为什么不直接使用对象初始化语法呢

var p = new Project() {
    LoanName = "New Loan Name",
    LoanProgram = 1,
    ProjectAddress = "123 Whatever Way"
};
公共类项目
{
上次修改的公共日期时间;
公共字符串借名;
公共字符串LoanNumber;
公共国际贷款计划;
公共字符串地址;
...
//项目类构造函数
公共项目(字典目录)
{
foreach(Dict中的KeyValuePair条目)
{
this.GetType().GetProperty(entry.Key).SetValue(this,entr.Value,null);
}
}
}

我建议查看默认参数

e、 g

我还建议使用公共属性而不是公共字段。 e、 g


这看起来像是一场维护噩梦,但您可以通过这种方式查找属性

var prop = typeof(Project).GetProperty(entry.Key);
然后可以这样设置值

prop.SetValue(this, entry.Value);

但是,这样做不会得到编译时类型检查。

这听起来非常愚蠢。这有什么好处?你必须用特定的键和值填充字典,然后将其作为参数传递到构造函数中,并找出如何使用它。为什么不首先传入值呢?或者,使用
对象初始值设定项
关于这一点,我并不确定我会采用这种方法(特别是因为它确实引入了不必要的复杂性),但遇到它并对如何解决它感到好奇。@Pubby-挖掘火花。@Servy同意。虽然初始化方法与字段和属性相同。@Servy-我简化了上面的代码,但实际上有私有字段和公共get/set访问器方法。值得注意的是,使用反射将导致性能损失。当然,这不是一种无效的方法,但其后果应该公之于众。然后,您当然需要处理不存在、不公开、类型不正确、静态等成员的字典键。对,但cdhowie已经给出了正确答案,这只是一个关于“我们如何通过属性名设置属性值”。他可以检查所有案例,捕捉关于此的异常。仅举一个例子。基于上面的许多评论,我同意此方法远不理想,但@TufanBarışYıldırım-感谢您的回复
public DateTime LastModified { get; private set; } //Makes it so only inside the class LastModified can be set
var prop = typeof(Project).GetProperty(entry.Key);
prop.SetValue(this, entry.Value);