C# 具有动态属性类型的DTO列表
我正在尝试创建一个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)。我的目标是添加一个列表,其
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