C# 将对象强制转换为列表<;(枚举,字符串)>;问题
我通过使用*Convert(object[]value,Type targetType,object参数,CultureInfo-culture)实现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
IMultiValueConverter来创建一个转换器。
我正在传递一个列表
元组
通过多重绑定,在转换器端,我想进行转换,但它抛出了一个转换错误
我试过:
var结果=(列表)值[1]代码>
但我有一个演员问题:
“无法将类型为”System.Collections.Generic.List1[System.ValueTuple
2[Vasco.Basics.Contracts.CoreConfigurations.Enums.ApplicationType,System.String]]”的对象强制转换为类型为“System.Collections.Generic.List1[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提供的扩展方法
一般来说,你不能像这样施放列表-因为你实际上在尝试什么