Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有动态属性类型的DTO列表_C#_.net - Fatal编程技术网

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

C# 具有动态属性类型的DTO列表,c#,.net,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是动态类型(仅限十进制、字符串或int)。我的目标是添加一个列表,其

我正在尝试创建一个Dto,如下所示:

public class GroupEventualityDto
{
    public int Id { get; set; }
    public int IdGroup { get; set; }
    public int IdEventuality { get; set; }
    public ???? Value { get; set; }
}
请注意,属性
Value
是动态类型(仅限十进制、字符串或int)。我的目标是添加一个
列表
,其中
groupeventualidto
具有数据decimal、int或其他case类型。
如何实现这一点?

为什么不使用这样的泛型类型

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类groupeventualidto
{
公共int Id{get;set;}
公共int IdGroup{get;set;}
public int IdEventuality{get;set;}
公共T值{get;set;}
}

为什么不是这样的泛型类型

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类groupeventualidto
{
公共int Id{get;set;}
公共int IdGroup{get;set;}
public int IdEventuality{get;set;}
公共T值{get;set;}
}

实现所需的唯一方法是使用基类,然后继承该基类并使该派生类成为泛型类,如下所示:

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抽象类groupeventualidto
{
公共int Id{get;set;}
公共int IdGroup{get;set;}
public int IdEventuality{get;set;}
}
公共类groupeventualidto:groupeventualidto
{
公共T值{get;set;}
}
公共静态void Main(字符串[]args)
{
var one=newgroupeventualitydto(){Value=123};
var two=newgroupeventualitydto(){Value=“string”};
var三=新的groupeventualidto(){Value=45.54};
var list=新列表()
{
一,,
二,,
三
};
foreach(列表中的var val)
{
Console.WriteLine(val.GetType());
}
}

但是,当您想将其从列表中删除时,您必须处理将其强制转换回的问题。

唯一的方法是使用基类,然后继承该基类并使该派生类成为泛型类,如下所示:

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抽象类groupeventualidto
{
公共int Id{get;set;}
公共int IdGroup{get;set;}
public int IdEventuality{get;set;}
}
公共类groupeventualidto:groupeventualidto
{
公共T值{get;set;}
}
公共静态void Main(字符串[]args)
{
var one=newgroupeventualitydto(){Value=123};
var two=newgroupeventualitydto(){Value=“string”};
var三=新的groupeventualidto(){Value=45.54};
var list=新列表()
{
一,,
二,,
三
};
foreach(列表中的var val)
{
Console.WriteLine(val.GetType());
}
}

但是,当您想将其从列表中删除时,您必须处理将其强制转换回的问题。

如果我正确理解了您的问题,您需要一个泛型类,但也需要将值的类型限制为特定类型

工作但相当丑陋的泛型类型限制
public类groupeventualidto
{
公共int Id{get;set;}
公共int IdGroup{get;set;}
public int IdEventuality{get;set;}
公共T值{get;set;}
公共组事件DTO(){
如果(!(Value为int | | Value为decimal | | Value为string))抛出新的ArgumentException(“GroupEventityDTO泛型类型必须是int、decimal或string”);
}
}
在第二次尝试中,我将只检查值的类型是否为预期类型之一,如果不是这样,则抛出ArgumentException

现在,当我使用

GroupEventualityDto<int> testTrue = new GroupEventualityDto<int>();
groupeventualidto testTrue=newgroupeventualidto();
一切都会按照我认为的方式进行,这个问题就是为了实现这个类

如果我试图使用的类型不适用于该类,如中所示

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


// System.ArgumentException: The GroupEventualityDto generic type must be either an int, decimal or string
groupeventualidto testFalse=newgroupeventualidto();
//System.ArgumentException:GroupEventityDTO泛型类型必须为int、decimal或string
上述异常将按预期方式抛出

你可以。我希望这种方法可以帮助你

也就是说,如果类型存储在一个有效类型数组中,那么它可能会更具可读性,并增强可用性,但不幸的是,我无法理解这一点


类型约束-这在这里不起作用 乍一看,我会想使用中的类型约束

public class GroupEventualityDto<T> where T: int, decimal, string
public类groupeventualidto其中T:int、decimal、string
会有用的。然而,事实证明,这是行不通的

“int”不是有效的约束。用作约束的类型必须是 接口、非密封类或类型参数


已经提出了一个密切相关的问题,结果表明,在这种情况下,类型约束不能用约束来限制。

如果我正确理解您的问题,您希望有一个泛型类,但也希望将值的类型限制为特定类型

工作但相当丑陋的泛型类型限制
public类groupeventualidto
{
公共int Id{get;set;}
公共int IdGroup{get;set;}
public int IdEventuality{get;set;}
公共T值{get;set;}
公共组事件DTO(){
如果(!(Value为int | | Value为decimal | | Value为string))抛出新的ArgumentException(“GroupEventityDTO泛型类型必须是int、decimal或string”);
}
}
在第二次尝试中,我将只检查值的类型是否为预期类型之一,如果不是这样,则抛出ArgumentException

现在,当我使用

GroupEventualityDto<int> testTrue = new GroupEventualityDto<int>();
groupeventualidto testTrue=newgroupeventualidto();
一切都会按照我认为的方式进行,这个问题就是为了实现这个类

如果我试图使用的类型不适用于该类,如中所示

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


// System.ArgumentException: The GroupEventualityDto generic type must be either an int, decimal or string
groupeventualidto testFalse=newgroupeventualidto();
//System.ArgumentException:GroupEventityDTO泛型类型必须为int、decimal或string
上述异常将按预期方式抛出

你可以。我希望这种方法可以帮助你

Tha