簡體   English   中英

具有動態屬性類型的DTO列表

[英]List of DTO with Dynamic type of propertie

我正在嘗試創建一個這樣的Dto:

public class GroupEventualityDto
{
    public int Id { get; set; }
    public int IdGroup { get; set; }
    public int IdEventuality { get; set; }
    public ???? Value { get; set; }
}

請注意,屬性Value是一種動態類型(僅十進制,字符串或整數)。 我實現了添加List<GroupEventualityDto> ,其中GroupEventualityDto的數據類型為小數,整數或其他大小寫類型。 如何實現呢?

進行所需操作的唯一方法是使用基類,然后繼承該基類,並使此派生類具有通用性,如下所示:

public abstract class GroupEventualityDto
{
    public int Id { get; set; }
    public int IdGroup { get; set; }
    public int IdEventuality { get; set; }
}

public class GroupEventualityDto<T> : GroupEventualityDto
{

    public T Value { get; set; }
}

public static void Main(string[] args)
{
    var one = new GroupEventualityDto<int>() {Value = 123};
    var two = new GroupEventualityDto<string>() {Value = "string"};
    var three = new GroupEventualityDto<double>() {Value = 45.54};

    var list = new List<GroupEventualityDto>()
    {
        one,
        two,
        three
    };

    foreach (var val in list)
    {
        Console.WriteLine(val.GetType());
    }
}

但是,當您希望將其從列表中刪除時,您將不得不將其撤回。

為什么不像這樣的泛型呢?

public class GroupEventualityDto<T>
{
    public int Id { get; set; }
    public int IdGroup { get; set; }
    public int IdEventuality { get; set; }
    public T Value { get; set; }
}

如果我正確地理解了您的問題,那么您既想擁有一個通用類,又希望將Value的類型限制為特定的類型。

有效但相當丑陋的泛型類型限制

public class GroupEventualityDto<T>
{
    public int Id { get; set; }
    public int IdGroup { get; set; }
    public int IdEventuality { get; set; }
    public T Value { get; set; }

    public GroupEventualityDto(){
        if(!(Value is int || Value is decimal || Value is string)) throw new ArgumentException("The GroupEventualityDto generic type must be either an int, decimal or string");
    }
}

在第二次嘗試中,我將檢查Value的類型是否為預期的類型之一,如果不是這種情況,則拋出ArgumentException。

現在,當我使用

GroupEventualityDto<int> testTrue = new GroupEventualityDto<int>();

一切都會以我認為該問題旨在實現此類的方式進行。

如果我正在嘗試使用一種不適用於該類的類型,如

GroupEventualityDto<float> testFalse = new GroupEventualityDto<float>();


// System.ArgumentException: The GroupEventualityDto generic type must be either an int, decimal or string

上面的異常將按預期拋出。

您可以在這里嘗試工作代碼 希望這種方法對您有所幫助!

話雖這么說,但如果將類型存儲在有效類型的數組中,則可以使其更具可讀性並增強可用性,但是不幸的是,我無法解決這個問題。


類型約束-在這里不起作用

乍一看,我會想到使用像

public class GroupEventualityDto<T> where T: int, decimal, string

會工作。 但是,事實證明這是行不通的。

“ int”不是有效的約束。 用作約束的類型必須是接口,非密封類或類型參數。

已經在這里提出一個密切相關的問題,事實證明,在這種情況下不能使用約束來約束類型約束。

暫無
暫無

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

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