【问题标题】:How to update Object Class with key c# [duplicate]如何使用密钥 c# 更新对象类 [重复]
【发布时间】:2021-07-07 10:13:07
【问题描述】:

我正在努力仅使用给定键更新对象。
现在我可以使用这个更新:

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;
}

我想先将其转换为数组,然后更新,然后再转换回对象。但我找不到将其转换为数组的方法。

你有什么建议吗?

【问题讨论】:

  • 使用反射 API 可以做到这一点。但是,如果您需要在一个紧凑的、性能繁重的循环中执行此操作,它将受到影响。为什么你首先需要这样做?如果新值不是字符串会发生什么?
  • 你想做什么,为什么?您正在使用对象,而不是字典。这些是属性,而不是键。如果您不想使用强类型对象,请不要使用 ORM。使用 DataTable 会更容易
  • 为什么要按名称设置属性?很重要

标签: c# arrays object


【解决方案1】:

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

    public static Person UpdateData(Person model, string key, string newvalue)
    {
        model.GetType().GetProperty(key).SetValue(model, newvalue);
        return model;
    }

但是,如果您真的想使用索引器,您可以在 Person 中执行类似的操作:

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

那么你可以像person["Highest"] = "45";这样使用它,但我真的不推荐这种方法。

【讨论】:

  • 谢谢,我找到了这个,打算关闭线程,但是你的比较短,`private void SetObjectProperty(string propertyName, string value, object obj) { PropertyInfo propertyInfo = obj.GetType() .GetProperty(propertyName); // 确保对象具有我们想要的属性 if (propertyInfo != null) { propertyInfo.SetValue(obj, value, null); } } ` 来自链接link
【解决方案2】:

我认为您需要使用 C# 的 dynamic 功能按键查找属性,或者通过类似于此答案 C# dynamically set property 的反射 API。

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

在您的情况下,最好的选择可能是使用像 automapper 这样的 Object Mapper 库。

【讨论】:

  • 我在我的其他代码中需要常规类,我认为如果我将其声明为动态,那么它将一直是动态的,除非 1. 我将常规类转换为动态类。 2. 更新数据。 3. 转回普通班。你是这个意思吗?如果是这样,我不知道如何将类转换为动态。
  • @Darvin 你为什么要首先按名称设置属性?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 2018-06-24
  • 2015-12-11
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
相关资源
最近更新 更多