【问题标题】:Generic way to set property on dynamic object在动态对象上设置属性的通用方法
【发布时间】:2023-03-18 14:18:01
【问题描述】:

我有一个动态对象。

如果属性存在,我想将属性设置为一个值

    private static void SetValue(ref dynamic property, object value)
    {
        if(property != null)
        { 
            property = value;
        }
    }

原来是这样的

SetValue(ref resource.name, "[parameters('name')]");
            

但是,这种方法不适用于动态,因为显然您不能为它们使用 ref

我该如何实现呢?如果这是唯一的方法,我很乐意使用扩展方法

我设置了很多可能存在也可能不存在的属性

如果没有这样的解决方案,我的代码将会一团糟,因为我需要经常检查 null

 if (resource["name"] != null)
 { 
     resource["name"] = "Value etc";
 }

保罗

【问题讨论】:

  • 所以这就像只在键已经存在的情况下才在字典中设置一个值?
  • 是的,我正在使用 json 并将其反序列化为动态,因为结构可以改变,我不想模仿它
  • 老实说,这听起来是个糟糕的主意,而且事实上ref 不是这样工作的。还有:value 实际上是dynamic,还是没有必要?即在这里反射就足够了吗?
  • 那么,如果d.ContainsKey(k),则将其写入字典并只为键k写入新值怎么样?
  • 我设法把它交给了 JObject,这很好,现在事实证明它实际上是一个 JObject

标签: c# dynamic


【解决方案1】:
private static void UpdateValue<T, TProperty>(
        ref T thing,
        Func<T, TProperty> getter,
        Action<T, TProperty> setter,
        TProperty value)
    {
        if(getter(thing) != null)
        {
            setter(thing, value);
        }
    }

可以直接调用:

UpdateValue<Employee>(
    ref person,
    (p) => p.name,
    (p, name) => p.name = name,
    "John Smith");

或者使用一些辅助包装器:

private static void UpdateName(ref Employee person, string name)
{
    UpdateValue(
        ref person,
        (p) => p.name,
        (p, name) => p.name = name,
        name);

}

private static void UpdateDob(ref Employee person, DateTime dob)
{
    UpdateValue(
        ref person,
        (p) => p.DateOfBirth,
        (p) => p.DateOfBirth = dob,
        dob);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2013-09-27
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多