c# – 如何将IEnumerable转换为IEnumerable
我正在努力完成以下任务.
假设我有这个数据模型: 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(); 但这会让我得到一个运行时类型,我不能将其用作Cast< genericArg>(). 如何投射IEnumerable< object>到IEnumerable的动态类型? 我应该注意,我的模型上不允许复杂的类型,所以像: public ICollection<Tag> Tags { get; set; } 不会发生.我只处理原始类型. 解决方法
你对铸造有一个基本的误解.
必须在编译时知道转换操作的结果类型.1 请考虑以下示例: string a = "abc"; object b = (object)a; string c = (string)b; a,b和c的运行时类型是相同的.这是字符串.编译时类型不同.转换仅与编译时类型相关. 因此,你的问题的答案
是:你没有.对于运行时类型,强制转换没有意义. 也就是说,让我为你的真正问题提供一个解决方案:假设你有一个IEnumerable< object>值,类型myTargetType并想要创建List< typeof(myTargetType)>包含值. 首先,使用反射创建列表: var listType = typeof(List<>).MakeGenericType(myTargetType); IList myList = (IList)Activator.CreateInstance(listType); 然后你填写清单: foreach (var item in values) { myList.Add(item); } 显然,如果值的条目不是运行时类型myTargetType,则Add将为throw an ArgumentException. 1结果类型可以是通用类型,但是generic type parameters have to be specified at compile time as well. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |