【发布时间】:2015-08-18 19:54:50
【问题描述】:
我正在尝试完成以下任务。
假设我有这个数据模型:
public class Article
{
public ICollection<string> Tags { get; set; }
}
这些标签是从数据库中检索的。我的数据库的 API 将它们作为 List<object> 返回给我。
因此,我需要将List<object> 转换为实现ICollection<string> 的东西。
我知道 LINQ Cast<T>() 方法将其元素转换为给定类型并返回转换后的 IEnumerable<T>。
但是,我不能使用Cast<string>(),因为这总是会将我的List<object> 转换为IEnumerable<string>,而不会为具有ICollection<double> 属性(或任何其他类型)的模型提供任何选项。
我可以使用反射并获取泛型类型参数:
Type genericArg = collectionType.GetGenericArguments().First();
但这会给我留下一个运行时Type,我不能将其用作Cast<genericArg>()。
如何将IEnumerable<object> 转换为动态Type 的IEnumerable?。
我应该注意,我的模型上不允许使用复杂类型,所以像:
public ICollection<Tag> Tags { get; set; }
不会发生。我只处理原始类型。
【问题讨论】:
-
我不明白 Cast
() 在每种情况下都有什么问题。 -
如果您不知道这些值是什么类型,您将如何使用它们?
-
“我的数据库的 API 将它们作为
List<object>返回给我”似乎修复 API 可以解决您的问题。为什么它不能返回不同的集合类型? -
我不能使用任何通用方法,因为直到运行时我才知道
T。这种映射方法将被许多模型调用,有时我必须转换为IEnumerable<string>,有时必须转换为IEnumerable<double> -
如果您在运行时之前不知道它拥有什么类型,为什么获得一个类型化的
IEnumerable<T>会对您有所帮助?你到底想完成什么?
标签: c# .net linq generics casting