【问题标题】:c# web api derived type is not serialisedc# web api派生类型未序列化
【发布时间】:2020-12-07 20:21:15
【问题描述】:

我需要在 Db 中存储各种类型的字段。我有具有所有公共属性的基字段类,并且我有具有每种字段类型的特定属性的派生类。

public class BaseField
{
   public string ID{get;set;}
   public string Name{get;set;}
}

public class CheckboxField:BaseField
{
   public bool Checked{get;set;}
}

我有一个 asp.net 核心 Web API 方法,它接受 BaseField 作为参数。当我尝试保存 CheckboxField 类型的对象时,它总是被转换为 BaseField。我知道由于参数是 BaseField 类型,它总是序列化为 BaseField 但我想知道如何使用相同的方法处理保存复选框字段。

【问题讨论】:

    标签: c# .net asp.net-web-api asp.net-core-webapi


    【解决方案1】:

    我有一个 asp.net 核心 Web API 方法,它接受 BaseField 作为参数。当我尝试保存 CheckboxField 类型的对象时,它总是被转换为 BaseField。

    是的,实际上它应该是这样工作的,因为您的方法接受基类并且您使用派生类型调用它,这将强制转换回基类。

    我知道由于参数是 BaseField 类型,它总是序列化到 BaseField 但我想知道如何使用相同的方法处理保存复选框字段。

    好吧,让我们首先在这里了解一件主要的事情,您实际上是 DB 表有Checked 列,还是您有一个用于 Base 类的表和另一个用于 Checkbox 的表。

    如果答案是肯定的,那么您的 DB 表具有 Checked 列以及来自 BaseField 的其他列,然后基本上替换您的方法以接受 CheckboxField 而不是 BaseField 作为参数。

    注意:如果在使用 BaseField 参数调用方法时仍需要 Checked 值的默认值,则可以为这种特殊情况创建方法覆盖:

    public void DoSomeChange(CheckboxField data) {
     ...
    }
    
    public void DoSomeChange(BaseField data) {
       var cData = new CheckboxField { 
        // initialize properties here, or create override constructor accepting BaseField in  
        // CheckboxField 
       };
    
       cData.Checked = true; // or false, it depends on what you need
    
       DoSomeChange(cData);
    }
    

    【讨论】:

    • 感谢您的快速回复。我正在使用 mongo db,我可以在其中存储多态字段对象。与 checkboxfield 一样,我还有其他针对不同字段类型的类。我不想在控制器中添加一个接受特定字段类型的方法。我想一次性存储所有信息。
    猜你喜欢
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    相关资源
    最近更新 更多