C# 将对象强制转换为列表<;(枚举,字符串)>;问题

C# 将对象强制转换为列表<;(枚举,字符串)>;问题,c#,list,casting,tuples,C#,List,Casting,Tuples,我通过使用*Convert(object[]value,Type targetType,object参数,CultureInfo-culture)实现IMultiValueConverter来创建一个转换器。 我正在传递一个列表元组 通过多重绑定,在转换器端,我想进行转换,但它抛出了一个转换错误 我试过: var结果=(列表)值[1] 但我有一个演员问题: “无法将类型为”System.Collections.Generic.List1[System.ValueTuple2[Vasco.Basi

我通过使用*Convert(object[]value,Type targetType,object参数,CultureInfo-culture)实现
IMultiValueConverter来创建一个转换器。

我正在传递一个
列表
元组

通过多重绑定,在转换器端,我想进行转换,但它抛出了一个转换错误

我试过:
var结果=(列表)值[1]

但我有一个演员问题:

“无法将类型为”System.Collections.Generic.List
1[System.ValueTuple
2[Vasco.Basics.Contracts.CoreConfigurations.Enums.ApplicationType,System.String]]”的对象强制转换为类型为“System.Collections.Generic.List
1[System.ValueTuple
2[System.Enum,System.String].””

这很奇怪,因为如果我只传递SomeEnumType的一个元素,并尝试使用大小写,比如
(Enum)值[1]
转换效果很好

当我传递一个
列表
并尝试像
(列表)一样强制转换时,值[1]
已经不起作用了

提前谢谢你

当我传递一个列表并尝试强制转换like(列表)值时,它已经不起作用了

一般来说,不允许将
List
IEnumerable
等泛型集合强制转换为其他类型。这可以归结为C#和编译器如何处理泛型和一些称为。这是一个令人难以置信的复杂话题,至少对我来说是这样,所以我不会用细节把你们难住

考虑以下情况

List strings=new(){“小猫”、“鼠标”、“马”};
List objs=字符串;
这看起来很自然,特别是如果您尝试显式地强制转换
字符串
列表,例如
(list)字符串
,但这不会编译,这是一件好事!它保护你不做傻事,例如:

List strings=new(){“小猫”、“鼠标”、“马”};
List objs=字符串;
对象添加(1.29d);
这似乎与你的问题无关,但这真的很重要,这正是你不能将一个收藏转换为另一种收藏的原因,即使你知道它们非常相似

当我们将
double
添加到
objs
列表中时(假设它不会编译),我们所做的有效工作就是将
double
添加到
列表中,这将打破诸如C#之类的强类型语言的工作方式

这很奇怪,因为如果我只传递SomeEnumType的一个元素,并尝试使用类似于大小写(Enum)的值转换,效果会很好

之所以可以这样做,但不能使用集合,是因为编译器可以使用单个对象检查是否存在有效转换,并手动执行转换。与编译器在集合中执行的操作不同,如果编译器在集合中执行的操作与在单个对象中执行的操作相同,则会向集合中添加与该集合初始化时约束的类型不匹配的内容

对于这一解释,请参见Ch4.4.1 ISBN 9781617294532

当我传递一个列表并尝试强制转换like(列表)值时,它已经不起作用了

一般来说,不允许将
List
IEnumerable
等泛型集合强制转换为其他类型。这可以归结为C#和编译器如何处理泛型和一些称为。这是一个令人难以置信的复杂话题,至少对我来说是这样,所以我不会用细节把你们难住

考虑以下情况

List strings=new(){“小猫”、“鼠标”、“马”};
List objs=字符串;
这看起来很自然,特别是如果您尝试显式地强制转换
字符串
列表,例如
(list)字符串
,但这不会编译,这是一件好事!它保护你不做傻事,例如:

List strings=new(){“小猫”、“鼠标”、“马”};
List objs=字符串;
对象添加(1.29d);
这似乎与你的问题无关,但这真的很重要,这正是你不能将一个收藏转换为另一种收藏的原因,即使你知道它们非常相似

当我们将
double
添加到
objs
列表中时(假设它不会编译),我们所做的有效工作就是将
double
添加到
列表中,这将打破诸如C#之类的强类型语言的工作方式

这很奇怪,因为如果我只传递SomeEnumType的一个元素,并尝试使用类似于大小写(Enum)的值转换,效果会很好

之所以可以这样做,但不能使用集合,是因为编译器可以使用单个对象检查是否存在有效转换,并手动执行转换。与编译器在集合中执行的操作不同,如果编译器在集合中执行的操作与在单个对象中执行的操作相同,则会向集合中添加与该集合初始化时约束的类型不匹配的内容


对于这一解释,Ch4.4.1 ISBN 9781617294532

一般来说,您不能像这样强制转换列表-因为您实际尝试的是强制转换列表中的每个项目,而不是列表本身。因此,您需要逐个循环和转换每个项目,如下所示:

var输入=新列表();
//现在将项目添加到输入列表中
var result=新列表();
foreach(输入中的var元素)
{
结果。添加(
((枚举)element.Item1,element.Item2)
);
}
请记住,元组不是单个元素,而是多个元素的包装器,每个元素都需要强制转换

或者,您可以使用允许您“映射”类型的工具,例如,或者-我个人更喜欢Mapster

使用Mapster;
var输入=新列表();
//现在将项目添加到输入列表中
var result=input.Adapt();
//Adapt()是Mapster提供的扩展方法

一般来说,你不能像这样施放列表-因为你实际上在尝试什么