例如,这里有一些通过反射创建List<int>的代码(是的,我知道有一些函数可以从数组转换为列表,问题不是关于解决方案,问题是在事先不知道类型的情况下使用反射。
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;
}所以我可以这样称呼它
int[] src = {4, 5, 6};
List<int> copy = Convert<List<int>>(src);但我也希望能够这样称呼它
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数组,但在调用反序列化代码时,我知道我希望它是什么类型:List、Stack、Queue等等。那么,有没有可能泛型转换为给定的类型,或者我是否必须为每种类型的泛型编写自定义代码?
我确信在某种程度上List,Stack,Queue是不同的,但C/C++/汇编程序员在我看来,给定一个整型数组和所需的类型,只要给定一个泛型构造函数(已经存在于上面的代码中),所有的信息都在那里进行重构。
发布于 2018-04-14 01:31:21
所以,有没有可能泛型转换为给定的类型,或者我必须为每种类型的泛型编写自定义代码?
如果它们都有一个接受IEnumerable的构造函数,那么试试这个:
public static T Convert<T>(int[] src) where T : new()
{
var obj = Activator.CreateInstance(typeof(T), src);
return (T)obj;
}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;
}
}https://stackoverflow.com/questions/49822100
复制相似问题