具有动态类型属性的DTO列表

时间:2017-11-09 19:30:02

标签: c# .net

我试图像这样创建一个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具有十进制数据类型,int或其他大小写类型。 如何实现?

3 个答案:

答案 0 :(得分:2)

执行所需操作的唯一方法是使用基类然后继承此基类并使此派生类如下所示:

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());
    }
}

当你想把它从列表中删除时,你将不得不处理它们。

答案 1 :(得分:1)

为什么不是这样的通用类型?

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

答案 2 :(得分:0)

如果我正确理解您的问题,您希望拥有泛型类,但又希望将 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

上述异常将像预期的那样被抛出。

你可以try out the working code here。我希望这种方法可以帮到你!

话虽如此,如果类型存储在有效类型的数组中,它可能会更有可读性并增强可用性但不幸的是我无法绕过它。

类型约束 - 在这里不能工作

乍一看,我会想到使用像

这样的类型约束
public class GroupEventualityDto<T> where T: int, decimal, string

会奏效。然而,事实证明这不起作用。

  

&#39; INT&#39;不是有效的约束。用作约束的类型必须是   接口,非密封类或类型参数。

已经提出了一个密切相关的问题here,事实证明,在这种情况下,类型约束不能受约束限制。