为嵌套输出重复使用相同的 POCO class

Reuse same POCO class for a nested output

我有一个 .NET Core API 必须 return 以下输出,

{
   "TotalValue":200,
   "Count":100,
   "TypeA":
   {
    "TotalValue":200,
   "Count":100   
   }
   "TypeB":
   {
    "TotalValue":200,
   "Count":100   
   }
}

我尝试了以下方法来实现这一点,

 public interface IValue
    {
        public int TotalValue { get; set; }
        public int Count { get; set; }
    }

    public class Type : IValue
    {
        public int TotalValue { get; set; }
        public int Count { get; set; }
    }

    public class Test
    {
        public int TotalValue 
        {
            get 
            {
                return TypeA?.TotalValue ?? 0 + TypeB?.TotalValue ?? 0;
            }
        }
        public int Count 
        {
            get
            {
                return TypeA?.Count ?? 0 + TypeB?.Count ?? 0;
            }
        } 

        public Type TypeA { get; set; }
        public Type TypeB { get; set; }
    }

但是根本没有添加值,我觉得即使我让它工作,也可以通过这种方式避免很多重复,有没有更优雅的解决方案来实现这个?

我必须分别设置 TypeA 和 TypeB 的值,TypeA 的值已设置,但是当我将值设置为 TypeB 时,求和没有发生。

由于运算符 ?? 的优先级,求和似乎没有发生。当你这样写时:

TypeA?.TotalValue ?? 0 + TypeB?.TotalValue ?? 0;

实际上可能是这个意思:

(TypeA?.TotalValue) ?? (0 + TypeB?.TotalValue ?? 0);

因此,如果 TypeA 不为空,则只返回其 TotalValue。来自 TypeB 的值无论是否为 null 都会被忽略。如果 TypeA 为空且 TypeB 不为空。返回值则来自 TypeB.TotalValue.

如果您不确定运算符的优先级,您应该明确地使用括号按照您想要的方式对表达式进行分组。它还有助于使表达更清晰。

要修复它,只需按照您想要的方式(据我了解)分组:

public int TotalValue 
{
     get 
     {
         return (TypeA?.TotalValue ?? 0) + (TypeB?.TotalValue ?? 0);
     }
}
public int Count 
{
     get
     {
         return (TypeA?.Count ?? 0) + (TypeB?.Count ?? 0);
     }
}