C# Cara umum untuk menyimpan properti yang tidak diketahui di Daftar

Saya ingin menyimpan Informasi Lisensi untuk beberapa domain di aplikasi saya.

Strukturnya terlihat sebagai berikut:

   public class LicenseData
    {
        // properties...
        public List<LicenseDomain> Domains { get; set; }
        // other properties...
    }

    public class LicenseDomain
    {
        // properties...
        public object LicenseConfig { get; set; }
    }

Kami memiliki beberapa domain dengan total properti berbeda, tetapi lisensinya mungkin berisi beberapa konfigurasi..

Misalnya:

{
   "MaxValidUsers": 5
}
{
   "Property": "xy"
   "SubProperty": { "Foo" : "Bar" 
   }
}

Pembuatannya tidak ada masalah sama sekali.. Tetapi jika saya memulihkan informasi dari file json yang saya tandatangani, saya membatalkan serialisasi ke objek..

Pola/kemungkinan mana yang harus saya kerjakan dengan Antarmuka/Abstrak/yang dapat saya (RE)simpan informasi umum di sini..

Saat ini saya meretas dengan:

JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(domain.LicenseConfig))

Tapi saya tidak setuju dengan diri saya sendiri.


person Andréw    schedule 14.09.2020    source sumber
comment
pertimbangkan untuk menggunakan kelas dasar...   -  person Daniel A. White    schedule 14.09.2020
comment
dengan konten seperti apa? menurutku benda itu akan tetap ada..   -  person Andréw    schedule 14.09.2020
comment
bagaimana dengan stackoverflow.com/a/4416536/2133965?   -  person VietDD    schedule 14.09.2020


Jawaban (1)


Jadi, berdasarkan konteks yang dapat saya ambil, saya sebenarnya merekomendasikan agar LicenseConfig Anda disimpan sebagai string JSON, yang akan memberi Anda kemampuan untuk melakukan sesuatu seperti ini:

public class LicenseDomain
{
    // properties...

    // Depending on how this is loaded,
    // this property (or at least its setter) could be made private/protected/internal
    public string LicenseConfigJson { get; set; }

    public T LicenseConfig<T>() where T : BaseLicenseConfig
    {
        if (string.IsNullOrWhiteSpace(LicenseConfigJson))
        {
            return null;
        }
        return JsonConvert.DeserializeObject<T>(LicenseConfigJson);
    }
    public void SaveLicenseConfig<T>(T config) where T : BaseLicenseConfig
    {
        if (config == null)
        {
            LicenseConfigJson = null; 
        }
        else
        {
            LicenseConfigJson = JsonConvert.SerializeObject(config);
        }
    }


}

Atau jika masing-masing LicenseDomain hanya dapat memiliki satu jenis LicenseConfig, Anda dapat menjadikannya sebagai parameter generik untuk kelas:

public class LicenseData
{
    // properties...
    public List<LicenseDomain<BaseLicenseConfig>> Domains { get; set; }
    // other properties...
}

public class LicenseDomain<T> where T : BaseLicenseConfig
{
    // properties...

    // Depending on where this value comes from, you could do this a variety of ways, 
    //but this is just one
    public string LicenseConfigJson { get; set; }
    public T LicenseConfig
    {
        get
        {
            if (string.IsNullOrWhiteSpace(LicenseConfigJson))
            {
                return null;
            }
            return JsonConvert.DeserializeObject<T>(LicenseConfigJson);
        }
        set
        {
            if (value == null)
            {
                LicenseConfigJson = null;
            }
            else
            {
                LicenseConfigJson = JsonConvert.SerializeObject(value);
            }
        }
    }
}

public abstract class BaseLicenseConfig
{
    
}

public class LicConfig1 : BaseLicenseConfig
{
    public int MaxValidUsers { get; set;}
}

public class LicConfig2 : BaseLicenseConfig
{
    public string Property {get;set;}
    public SubProp SubProperty {get;set;}
}

public class SubProp
{
    public string Foo {get;set;}
}

Dalam kedua kasus tersebut, kelas BaseLicenseConfig secara ketat bertujuan untuk memastikan bahwa semua yang ada di daftar domain dapat berasal dari beberapa jenis kelas dasar. Jika itu tidak penting, Anda tidak memerlukan kelas dasar dan dapat menghapus Where T : BaseLicenseConfig dari kelas LicenseDomain.

person s0n1c    schedule 15.09.2020