簡體   English   中英

抽象基礎 class 列表僅返回基礎 class 的屬性

[英]List of abstract base class only return properties from base class

我有一個與此類似的 model 設置。 從抽象基 class 繼承的兩個類。

// Models
public abstract class Transaction 
{
    // Shared Properties..
}
public class TransactionType1 : Transaction
{
    public int TxType1Prop { get; set;}
}
public class TransactionType2 : Transaction
{
    public int TxType2Prop { get; set;}
}

在我的 API 中,我有一個“基類”列表,我用不同的事務類型填充它。 當我在返回一切看起來不錯之前進行調試時,會填充各個屬性等。

// Ctrl
public IAtionResult GetTransactions()
{
    var transactions = new list<Transaction>() 
    {
        new TransactionType1(),
        new TransactionType2() 
    }
    return Ok(transactions);
} 

但是,當 Api 調用返回到 swagger 時,僅包含來自基礎 class 的共享屬性。

結果中不包含 IE TxType1PropTxType2Prop

是否只能使用 memory 中的這些屬性,還是我可以讓我的結果也包含它們?

不幸的是,您不能在帶有“開箱即用”序列化程序的接口處使用通用基類[這是用於“開箱即用”設置的 - 正如 Ben 提到的,有一些方法可以解決它] 您可以提供一個自定義 JSON 序列化程序,它可能能夠處理這個問題。 在我的選擇中,即使它正在工作,它也不是最干凈的解決方案,因為:

  1. 您正在公開有關您的應用程序的內部信息(如序列化程序)
  2. 你放大你的 JSON
  3. 你降低了可讀性
  4. API 是關於合約的,多態性在一定程度上打破了這一點

您可以在此處閱讀有關 API 多態性的更多信息。

在我看來,最好的方法是使用另一種類型的 class 作為傳輸 object,它由主要屬性和附加的“額外屬性”(子類屬性)的鍵值集組成,你可以發送所有需要的信息(也許你想添加類型信息以便在客戶端處理)。

public class TransactionTransport {
   // other attributes ommited

   // attribute name / attribute value
   Map<String, Object> AdditionalValues {get; set;}
}

在這種情況下,您需要使用 API 中的子類的屬性填充AdditionalValues (將子類映射到TransactionTransport ),您可以使用 go。

這也會略微降低可讀性,但 JSON 中不需要的內容會減少很多。 此外,您不會將任何內部的東西暴露在野外。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM