如何确保 .Net API Dto 中的通用负载?

How can I ensure a generic payload in a .Net API Dto?

我有一个用于创建客户组织的 DTO。

public record clientDto(string legalname, string name, string country, australianClientData payload);

public record australianClientData(int abn);

australianClientData 中的这些属性特定于澳大利亚组织。来自其他国家的组织将具有自己的特定属性。

如何确保 payload 的类型允许不同的子类型(即 usaClientData、chinaClientData)?

失败尝试 #1 - 使用基地 class

我已经尝试让 australianClientData 从基础 class parentPayload 继承。这个问题是我的控制器假设有效载荷是基数 class(空)所以它完全忽略了它。

失败的尝试 #2 - 使用通用 class

@stuartd 这是我想出的。

    public record clientDto(string legalname, string name, string country);
    public record clientDto<TCountry>(string legalname, string name, string country, TCountry? payload) where TCountry : parentPayload;

    public abstract record parentPayload();
    public record payloadAustraliaClientData(int abn, string aciclabel, string acicofficecode) : parentPayload;
[HttpPost]
        public clientDto Post([FromBody] clientDto clientObject)
        {
            return clientObject;
        }

问题是我很难 return 从我的 API 中输入正确的类型。我知道 clientDto<TCountry> 不同于 clientDto(我的数据可以是两者之一),但我的 API 接受并且 returns clientDto。我在 C# 方面经验不足,我不知道如何期望或 return 适当的类型。

另一种方法是使用可选属性:

public record clientData(int? abn, int? ssn);

然后让API隐式找出底层的DTO。您还可以通过枚举强类型请求:

public record clientData(ClientType type, int? abn, int? ssn);

这样 API 知道要提取哪些属性并在缺少时使请求失败。