c# - 如何将一种类型的通用列表转换为未知类型的通用列表

标签 c# generics reflection

我想写一个接受 List<Object> 的函数并返回转换为指定对象类型列表的原始列表 List<ObjectType> ,知道原始列表中的对象属于 ObjectType 类型.诀窍是 ObjectType可以是任何类型,我使用反射找到它。很抱歉缺少代码,但我什至无法理解如何去做这件事。

最佳答案

如果您知道列表中的每一项都是 ObjectType 类型,您可以这样做:

List<object> sourceList = new List<object>() { 1, 2, 3 };
List<int> resultList = sourceList.Cast<int>().ToList();

如果您真的想以通用方式转换列表中的每个项目,最简单的方法是执行如下操作:

public static IEnumerable<T> ConvertTo<T>(this IEnumerable items)
{
    return items.Cast<object>().Select(x => (T)Convert.ChangeType(x, typeof(T)));
}

这将作为扩展方法实现,因此您可以编写:

List<object> sourceList = new List<object>() { 1, 2, 3 };
List<string> resultList = sourceList.ConvertTo<string>().ToList();

如果目标类型在编译时未知,您确实需要使用反射。这样的事情会起作用:

class ListUtil
{
    public static List<T> ConvertToList<T>(this IEnumerable items)
    {
        // see method above
        return items.ConvertTo<T>().ToList();
    }

    public static IList ConvertToList(this IEnumerable items, Type targetType)
    {
        var method = typeof(ListUtil).GetMethod(
            "ConvertToList", 
            new[] { typeof(IEnumerable) });
        var generic = method.MakeGenericMethod(targetType);
        return (IList)generic.Invoke(null, new[] { items });
    }
}

现在你可以这样调用它:

List<object> sourceList = new List<object>() { 1, 2, 3 };
IList resultList = ListUtil.ConvertToList(sourceList, typeof(string));
resultList.GetType(); // List<string>

当然,使用此方法会失去任何编译时类型安全性。

关于c# - 如何将一种类型的通用列表转换为未知类型的通用列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17758888/

相关文章:

c# - 是否可以重构此 nHibernate Linq 查询?

Java反射丢失注解信息

haskell - 使用 generics-sop 删除特定类型的字段

java - 使用默认方法从参数化接口(interface)中提取类

c# - 如何知道静态方法的类名

c# - 在 GridView 中翻转项目图像

c# - 在 C# 中,BitArray 获取位值的速度是否比简单的位移运算更快?

c# - 带 Cookie 的 WebRequest HTTP POST(来自 curl 脚本的端口)

java - 使用带有 DAO 模式的 Guice 进行依赖注入(inject)

java - 为什么 Java 7 和 Eclipse 3.8 编译器无法使用新的 Java 7 菱形运算符编译 JDK 代码?