You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中对DataMember属性值进行求和合并?

问题描述

我定义了如下事件类:

[Serializable]
[DataContract]
public class BaseEvent
{
    [DataMember]
    public int count { get; set; }

    [DataMember]
    public SubEventClass SubEventClass { get; set; }
}

以及如下的SubEventClass类:

[Serializable]
[DataContract]
public class SubEventClass
{
    [DataMember]
    public int Width { get; set; }

    [DataMember]
    public long Length { get; set; }

    [DataMember]
    public long Area { get; set; }
}

我期望通过调用以下方法合并/求和两个BaseEvent对象的属性值:

public static BaseEvent MergeQueryShapeStats(BaseEvent obj1, BaseEvent obj2)
{
    obj1.count += obj2.count;

    var properties = typeof(SubEventClass).GetProperties();

    foreach (var prop in properties)
    {
        var value = prop.GetValue(obj2.SubEventClass, null);

        if (value != null)
            prop.SetValue(obj1.SubEventClass, value, null);
    }

    return obj1;
}

但目前这段代码只是将obj2的属性值直接赋值给obj1,请问如何修改才能将obj2与obj1的属性值求和后更新obj1?


解决方案

你需要获取obj1对应属性的当前值,与obj2的属性值相加后再赋值回obj1,同时要处理空引用检查和不同数值类型的转换,以下是修改后的完整方法:

public static BaseEvent MergeQueryShapeStats(BaseEvent obj1, BaseEvent obj2)
{
    // 处理count字段的求和
    obj1.count += obj2.count;

    // 空引用检查:如果任一SubEventClass为null,直接处理避免报错
    if (obj1.SubEventClass == null || obj2.SubEventClass == null)
    {
        // 若obj1的子对象为空,则用obj2的子对象替换(若两者都为空则保持null)
        obj1.SubEventClass = obj1.SubEventClass ?? obj2.SubEventClass;
        return obj1;
    }

    var properties = typeof(SubEventClass).GetProperties();

    foreach (var prop in properties)
    {
        // 获取obj1和obj2当前属性的值
        var value1 = prop.GetValue(obj1.SubEventClass);
        var value2 = prop.GetValue(obj2.SubEventClass);

        // 根据属性类型执行求和操作
        if (prop.PropertyType == typeof(int))
        {
            var sum = (int)value1 + (int)value2;
            prop.SetValue(obj1.SubEventClass, sum);
        }
        else if (prop.PropertyType == typeof(long))
        {
            var sum = (long)value1 + (long)value2;
            prop.SetValue(obj1.SubEventClass, sum);
        }
        // 后续若新增其他数值类型(如float、double),可在此扩展分支
    }

    return obj1;
}

关键修改说明:

  1. 空引用防护:增加了对obj1.SubEventClass和obj2.SubEventClass的空值判断,避免运行时抛出NullReferenceException
  2. 求和逻辑替换:不再直接覆盖obj1的属性值,而是先获取obj1的原有值,与obj2的值相加后再赋值
  3. 类型针对性处理:针对int和long两种不同的数值类型分别处理,确保类型转换安全,避免出现类型不匹配的错误

内容的提问来源于stack exchange,提问作者Deritha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 05:27:12