gpt4 book ai didi

c# - 在 C# 中使用反射进行转换

转载 作者:太空狗 更新时间:2023-10-30 00:27:47 26 4
gpt4 key购买 nike

我已经创建了一个通用函数,如下所示(只是一个证明),它将采用 List<T>收集并反转它,返回一个新的 List<T>作为它的输出。

public static List<T> ReverseList<T>(List<T> sourceList)
{
T[] outputArray = new T[sourceList.Count];
sourceList.CopyTo(outputArray);
return outputArray.Reverse().ToList();
}

证明的目的是我只知道什么T在运行时。因此,我使用反射来调用上述方法,如下所示:

List<int> myList = new List<int>() { 1, 2, 3, 4, 5 }; // As an example, but could be any type for T

MethodInfo myMethod = this.GetType().GetMethod("ReverseList");
MethodInfo resultMethod = myMethod.MakeGenericMethod(new Type[] { typeof(int) });
object result = resultMethod.Invoke(null, new object[] { myList });

这里有两个问题:

  1. 在第二行,而不是提供 typeof(int) ,我想提供类似于 myList.GetType().GetGenericArguments()[0].GetType() 的产品为了使事情更灵活,因为我不知道T直到运行时。当 Invoke 按如下方式运行时,这样做会导致运行时错误:“Object of type 'System.Collections.Generic.List'1[System.Int32]' cannot be converted to type 'System.Collections.Generic.List'1[ System.RuntimeType]'。”
  2. Invoke() 的结果方法返回一个对象。调试时,我可以看到该对象是 List 类型,但尝试使用它时告诉我我有一个无效的转换。我假设我需要使用反射将结果装入正确的类型(即在本例中,相当于 (result as List<int> )。

有没有人有任何指示可以帮助我解决这个问题?抱歉,如果不清楚,我可能会提供更多详细信息。

TIA

最佳答案

您的 GetType() 太多了。发生在每个人身上。

myList.GetType().GetGenericArguments()[0] 是一个 System.Type -- 您正在寻找的那个。

myList.GetType().GetGenericArguments()[0].GetType() 是一个 System.Type 描述 System.Type (嗯,实际上是具体的子类 System.RuntimeType)。


另外,您的 ReverseList 函数是严重矫枉过正。它执行额外的复制只是为了避免调用 List.Reverse。有一种更好的方法可以避免这种情况:

public static List<T> ReverseList<T>(List<T> sourceList)
{
return Enumerable.Reverse(sourceList).ToList();
}

public static List<T> ReverseList<T>(List<T> sourceList)
{
var result = new List<T>(sourceList);
result.Reverse();
return result;
}

public static List<T> ReverseList<T>(List<T> sourceList)
{
var result = new List<T>();
result.Capacity = sourceList.Count;
int i = sourceList.Count;
while (i > 0)
result.Add(sourceList[--i]);
return result;
}

关于c# - 在 C# 中使用反射进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5144047/

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