【问题标题】:Reuse same POCO class for a nested output为嵌套输出重用相同的 POCO 类
【发布时间】:2021-05-04 12:37:29
【问题描述】:

我有一个必须返回以下输出的 .NET Core API,

{
   "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时,总和没有发生。

【问题讨论】:

  • TypeATypeB 是相同的,因此您可以对这两个属性使用相同的类。
  • 是的,我应该想到这一点。仍然没有发生值的总和。另外,当我必须在单独的操作中设置 TypeA 和 TypeB 的值时会发生什么?
  • 您必须确保在调用计算属性之前设置了 TypeA 和 TypeB。
  • 当我为 TypeA 设置值时,会计算这些值,但下次我为 TypeB 设置时它不会发生

标签: c# asp.net-core poco


【解决方案1】:

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

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

实际上可能是这个意思:

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

因此,如果您的 TypeA 不为空,则仅返回其 TotalValueTypeB 中的值无论是否为空都会被忽略。如果你有 TypeA null 和 TypeB not null。然后返回值来自TypeB.TotalValue

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

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

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

【讨论】:

  • 这成功了!也非常感谢您的清晰解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
相关资源
最近更新 更多