gpt4 book ai didi

c# - 如何将 IEnumerable 转换为 IEnumerable
转载 作者:行者123 更新时间:2023-11-30 19:38:35 28 4
gpt4 key购买 nike

我正在努力完成以下任务。

假设我有这个数据模型:

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>IEnumerable动态 Type

我应该注意,我的模型不允许使用复杂类型,所以像这样:

public ICollection<Tag> Tags { get; set; }

不会发生。我只处理原始类型。

最佳答案

你对类型转换有一个基本的误解。

强制转换操作的结果类型必须在编译时已知。¹

考虑以下示例:

string a = "abc";
object b = (object)a;
string c = (string)b;

a运行时类型 , bc是一样的。这是string . 编译时类型 不同。转换仅与编译时类型相关。

因此,你的问题的答案

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

是:你不知道。转换对于运行时类型没有意义。


也就是说,让我为您的实际问题提供一个解决方案:假设您有一个 IEnumerable<object> values , 一个 Type myTargetType并想创建一个 List<typeof(myTargetType)>包含值。

首先,您使用反射创建列表:

var listType = typeof(List<>).MakeGenericType(myTargetType);
IList myList = (IList)Activator.CreateInstance(listType);

然后填写列表:

foreach (var item in values)
{
myList.Add(item);
}

显然,Addthrow an ArgumentException如果条目 values 不是 运行时类型 myTargetType .


¹ 结果类型可以是泛型,但 generic type parameters have to be specified at compile time as well .

关于c# - 如何将 IEnumerable<object> 转换为 IEnumerable<runtime type>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32081513/

28 4 0