gpt4 book ai didi

c# - 有没有一种通用的方法可以通过 C# 中的反射来填充各种通用集合?

转载 作者:行者123 更新时间:2023-11-30 14:22:24 25 4
gpt4 key购买 nike

例如,这里有一些代码可以创建一个 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方法

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

我在某种程度上确定 List , Stack , Queue是不同的,但我的 C/C++/Assembly 程序员看到给定一个 int 数组和所需的类型,所有信息都在那里重建,只给定一个通用构造函数(已经存在于上面的代码中)。

最佳答案

对于您的具体情况,如果您只是更改 Convert传递 src 的方法作为构造函数的参数,它将起作用:

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, src);

return arrayLike;
}

所以你可以像这样使用它:

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

因此您可能希望在构造函数中添加一些类型检查以验证它是否可以接受 IEnumerable<int> 的类型.

但是你必须知道顺序。例如,集合将按顺序包含:

copy :

6, 5, 4

copy2 and copy3:

4, 5, 6

If you want copy to contain them in the same order, just reverse the array:

Stack<int> copy = Convert<Stack<int>>(src.Reverse().ToArray());


Try it out

关于c# - 有没有一种通用的方法可以通过 C# 中的反射来填充各种通用集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49822100/

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