加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何将IEnumerable转换为IEnumerable

发布时间:2020-12-15 23:26:46 所属栏目:百科 来源:网络整理
导读:我正在努力完成以下任务. 假设我有这个数据模型: public class Article{ public ICollectionstring Tags { get; set; }} 从数据库中检索这些标记.我的数据库的API将它们作为List object返回给我. 因此,我需要从List object进行转换.到实现ICollection strin
我正在努力完成以下任务.

假设我有这个数据模型:

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的运行时类型是相同的.这是字符串.编译时类型不同.转换仅与编译时类型相关.

因此,你的问题的答案

How to cast an IEnumerable<object> to an IEnumerable<runtime type>

是:你没有.对于运行时类型,强制转换没有意义.

也就是说,让我为你的真正问题提供一个解决方案:假设你有一个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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读