首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中有没有通过反射填充各种泛型集合的通用方法?

在C#中有没有通过反射填充各种泛型集合的通用方法?
EN

Stack Overflow用户
提问于 2018-04-14 01:12:39
回答 1查看 58关注 0票数 3

例如,这里有一些通过反射创建List<int>的代码(是的,我知道有一些函数可以从数组转换为列表,问题不是关于解决方案,问题是在事先不知道类型的情况下使用反射。

代码语言:javascript
复制
public static T Convert<T>(int[] src)
{
    Type genericClassType = typeof(T);
    Type[] typeParameters = genericClassType.GetGenericArguments();
    Type genericTypeDef = genericClassType.GetGenericTypeDefinition();
    Type constructedClass = genericTypeDef.MakeGenericType(typeParameters);
    T arrayLike = (T)Activator.CreateInstance(constructedClass);

    System.Reflection.MethodInfo method = arrayLike.GetType().GetMethod("Add", typeParameters);

    foreach (int value in src) {
        method.Invoke(arrayLike, new []{(object)value});
    }

    return arrayLike;
}

所以我可以这样称呼它

代码语言:javascript
复制
int[] src = {4, 5, 6};
List<int> copy = Convert<List<int>>(src);

但我也希望能够这样称呼它

代码语言:javascript
复制
int[] src = {4, 5, 6};
Stack<int> copy = Convert<Stack<int>>(src);

int[] src = {4, 5, 6};
Queue<int> copy = Convert<Queue<int>>(src);

但是我不能这样做,因为例如Stack没有Add方法

实际上,我正在做一些反序列化工作,并试图使其成为泛型或半泛型。源数据没有类型信息。它只是一个int数组,但在调用反序列化代码时,我知道我希望它是什么类型:ListStackQueue等等。那么,有没有可能泛型转换为给定的类型,或者我是否必须为每种类型的泛型编写自定义代码?

我确信在某种程度上ListStackQueue是不同的,但C/C++/汇编程序员在我看来,给定一个整型数组和所需的类型,只要给定一个泛型构造函数(已经存在于上面的代码中),所有的信息都在那里进行重构。

EN

回答 1

Stack Overflow用户

发布于 2018-04-14 01:31:21

所以,有没有可能泛型转换为给定的类型,或者我必须为每种类型的泛型编写自定义代码?

如果它们都有一个接受IEnumerable的构造函数,那么试试这个:

代码语言:javascript
复制
public static T Convert<T>(int[] src) where T : new()
{
    var obj = Activator.CreateInstance(typeof(T), src);
    return (T)obj;
}

Here it is as a Fiddle.

代码语言:javascript
复制
using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        int[] src = {4, 5, 6};
        List<int> copy = Convert<List<int>>(src);
        Stack<int> copy1 = Convert<Stack<int>>(src);
        Queue<int> copy2 = Convert<Queue<int>>(src);

        Console.WriteLine(string.Join(",",copy));
        Console.WriteLine(string.Join(",",copy1));
        Console.WriteLine(string.Join(",",copy2));    
    }

    public static T Convert<T>(int[] src) where T : new()
    {
        var obj = Activator.CreateInstance(typeof(T), src);
        return (T)obj;
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49822100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档