Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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更新对象类#_C#_Arrays_Object - Fatal编程技术网

C# 如何使用键c更新对象类#

C# 如何使用键c更新对象类#,c#,arrays,object,C#,Arrays,Object,我正在努力用给定的密钥更新对象。 现在,我可以使用以下内容进行更新: public class Person { public int Id {get;set;} public string Name {get;set;} public string Highest {get;set;} public ..... (so many more) } 这就是我用的 var model = db.Person.Find(1); model.Highest = &quo

我正在努力用给定的密钥更新对象。
现在,我可以使用以下内容进行更新:

public class Person {
    public int Id {get;set;}
    public string Name {get;set;}
    public string Highest {get;set;}
    public ..... (so many more)
}
这就是我用的

var model = db.Person.Find(1);
model.Highest = "20 meters";
我希望它的行为类似于一个数组,其中我将仅根据以下键更新数据:

 var key = "Highest";
 var model = db.Person.Find(1);
 model[key] = "20 meters";
这样我就可以把它用作函数

public Person UpdateData(Person model,string key,string newvalue){
 model[key] = newvalue;
 return model;
}
我想先把它转换成数组,然后更新,再转换回object。但是我找不到一种方法把它转换成数组


您有什么建议吗?

我认为您需要使用C的
动态
功能,通过键或类似于此答案的反射API来查找属性

但是要注意由于不兼容的类型而可能发生的类型安全和运行时错误


在您的情况下,最好的选择可能是使用对象映射器库,如。

您可以更改
UpdateData
方法,使其使用反射。我会放弃使用索引器(
model[key]
)的想法

然而,如果您真的想使用indexer,您可以在您的
人员中执行类似操作:

    public object this[string propName]
    {
        get => this.GetType().GetProperty(propName).GetValue(this);
        set => this.GetType().GetProperty(propName).SetValue(this, value);
    }

然后你可以像这样使用
person[“Highest”]=“45”,但我并不推荐这种方法。

我需要在我的其他代码中使用常规类,我认为如果我将它声明为动态类,那么它将一直是动态的,除非1。我将常规类转换为动态类。2.更新数据。3.转换回常规类。这就是你的意思吗?如果是这样,我不知道如何将该类转换为动态。@Darvin为什么要按名称设置属性?可以使用反射API来实现这一点。但是,如果您需要在一个紧凑的、高性能的循环中执行此操作,它将受到影响。你为什么一开始就要这么做?如果新值不是字符串,会发生什么?您想做什么?为什么?您使用的是对象,而不是字典。这些是属性,不是键。如果不想使用强类型对象,请不要使用ORM。使用DataTable会更容易为什么要按名称设置属性?这很重要谢谢你,我找到了这个并计划关闭线程,但是你的更短,`private void SetObjectProperty(string propertyName,string value,object obj){PropertyInfo PropertyInfo=obj.GetType().GetProperty(propertyName);//如果(PropertyInfo!=null),请确保对象具有我们所关注的属性{propertyInfo.SetValue(obj,value,null);}}}`来自链接
    public object this[string propName]
    {
        get => this.GetType().GetProperty(propName).GetValue(this);
        set => this.GetType().GetProperty(propName).SetValue(this, value);
    }