![](/img/trans.png)
[英]c# extract base class properties only based on derived class and return new base class object
[英]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 TxType1Prop
和TxType2Prop
。
是否只能使用 memory 中的這些屬性,還是我可以讓我的結果也包含它們?
不幸的是,您不能在帶有“開箱即用”序列化程序的接口處使用通用基類[這是用於“開箱即用”設置的 - 正如 Ben 提到的,有一些方法可以解決它] 。 您可以提供一個自定義 JSON 序列化程序,它可能能夠處理這個問題。 在我的選擇中,即使它正在工作,它也不是最干凈的解決方案,因為:
您可以在此處閱讀有關 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.