簡體   English   中英

如何創建具有“靈活”屬性的 C# class?

[英]How to create a C# class with 'flexible' properties?

我正在嘗試編寫一個 JSON 文件,該文件包含一系列問題,每個問題基本上具有以下結構:

{
        "values": [
            "oui"
        ],
        "question": "h_d",
        "type": "radio",
        "conditions": {
            "lhs": {
                "question": "valeur_wed"
            },
            "operator": "eq",
            "rhs": 0
        },
        "conditionalInfo": []
    },

生成 JSON 文件的方法是創建一個JSONQuestion class,為此我為每個問題創建一個新實例,並為屬性提供不同的值。 然后我執行JsonSerializer.Serialize(list_of_JSONQuestion_instances)以獲得我的 JSON 文本文件(使用 System.Text.Json)。

現在,這一切都很好,除了每個問題中的“條件”元素實際上應該更靈活。 例如,“lhs”(和/或“rhs”)本身可以包含一個完整的其他條件,如下所示:

{
        "values": [],
        "question": "calcul_wed_rugosite_cp",
        "conditions": {
            "lhs": {
                "lhs": {
                    "question": "valeur_wed"
                },
                "operator": "eq",
                "rhs": "calcule"
            },
            "operator": "and",
            "rhs": {
                "lhs": {
                    "question": "calcul_h_sur_d_script"
                },
                "operator": "eq",
                "rhs": 1
            }
        },

它甚至可以更深地 go,具有更多的 lhs 和 rhs 級別。 因此,每個問題的左側和右側可能具有不同的復雜性。

因此,我的問題是:如何創建某種具有 3 個屬性( lhsrhsoperator )但“靈活”的Condition class ? 有時rhs只是一個string或一個int ,但有時它是一個全新的Condition istelf。 對於lhs也是如此。

這完全可行嗎?

我在想用這個:

public class Condition<L, R>
    where L : class
    where R : class
   {
        public L lhs { get; set; }
        public string @operator { get; set; }
        public R rhs { get; set; }
    }

...但是如何在我的主要 JSONQuestion class 中聲明“條件”屬性? 因為我顯然不能這樣做:

public class JSONQuestion
{
    public string question { get; set; }
    public Condition<L, R> conditions { get; set; }
    ...
}

您可以使用[JsonExtensionData]屬性。 它允許您聲明一個字典屬性,您可以在反序列化后分析它以查看它包含的內容。 我們主要在需要將 JSON 數據嵌入到我們自己的 JSON 中時使用它。

如果您使用的是 Newtonsoft.JSON:
https://www.newtonsoft.com/json/help/html/DeserializeExtensionData.htm

如果您使用 .NET 的 JSON 實現:
https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-handle-overflow?pivots=dotnet-6-0

我通常會盡量避免使用自定義(反)序列化器,所以我偏向於不使用它們的解決方案。

我會有這樣的數據結構:

public class Node
{
   public string? Type{ get; set; } // This decide what other values mean
   public string? Value { get; set; }
   public Node Lhs? { get; set; }
   public string? Operator { get; set; }
   public Node? Rhs { get; set; }
}

這非常簡單,但允許表示您顯示的樹。

json 是這樣的:

{
    "Type": "Question",
    "Value": "calcul_wed_rugosite_cp",
    "Lhs": {
        "Lhs": {
            "Type": "Question",
            "Value": "valeur_wed"
        },
        "Operator": "eq",
        "Rhs": {
            "Type": "calcule",
            "Value": "I'm not sure how 'calcule' condition works" 
        }
    },
    "Operator": "and",
    "Rhs": {
        "Lhs": {
            "Type": "Questions",
            "Value": "calcul_h_sur_d_script"
        },
        "Operator": "eq",
        "Rhs": {
            "Type": "Value",
            "Value": "1"
        }
    }
}

暫無
暫無

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

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