gpt4 book ai didi

带有 System.Type 的 Linq Cast

转载 作者:行者123 更新时间:2023-12-04 15:04:37 25 4
gpt4 key购买 nike

LinQ 包含方法 Actor 它将列表中的每个条目转换为类型 电话 .假设我们有一个如下所示的列表:

List<Object> obj = new List<Object>();
obj.Add("A");
obj.Add("B");

一个工作 Actor 可能是
var list = obj.Cast<string>();

我想做什么
Type t = typeof(String);
Object list = obj.Cast(t);

一个解决方案是使用反射并一般创建一个列表并填充它,但我想知道是否存在更好的解决方案?听说 .NET 4.0 应该支持一些协方差/反方差,这可能是一种方法。

额外信息和反射解决方案

我得到的错误是以下 The model item passed into the dictionary is of type System.Collections.Generic.List1[IStatisticEntry], but this dictionary requires a model item of type System.Collections.Generic.List1[CrashStatistic+CrashEntry] .
请注意, CrashEntry 实现 IStaticEntry 但不能强制转换,因为它是列表的泛型类型。

我通过我想要没有反射的东西构建了以下解决方案:
    public static object Cast(this IEnumerable list, Type type)
{
var newList = Activator.CreateInstance(typeof(List<>).MakeGenericType(type));

foreach (var item in list)
newList.GetType().GetMethod("Add").Invoke(newList, new object[] { item });

return newList;
}

最佳答案

我不太明白你为什么要这样做,但你可以调用 Enumerable.Cast<T>通过反射(reflection):

List<object> objectList = new List<object> { "Foo", "Bar" };
object stringSequence = typeof(Enumerable)
.GetMethod("Cast", BindingFlags.Public | BindingFlags.Static)
.MakeGenericMethod(typeof(string))
.Invoke(null, new[] { objectList });

在这种情况下,运行时类型为 stringSequence将实现 IEnumerable<string> .

关于带有 System.Type 的 Linq Cast<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3449349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com