Я создал обобщенную функцию, как показано ниже (просто доказательство), которая примет коллекцию 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 });
Здесь есть две проблемы:
- Во второй строке, вместо того, чтобы указывать
typeof(int)
, я бы хотел, чтобы somthign сродни myList.GetType().GetGenericArguments()[0].GetType()
, чтобы сделать вещи более гибкими, потому что я не знаю T
до времени выполнения. Это приводит к ошибке времени выполнения, когда Invoke выполняется следующим образом: «Объект типа« System.Collections.Generic.List'1 [System.Int32] »не может быть преобразован в тип« System.Collections.Generic.List'1 [ System.RuntimeType] ".
- Результат метода
Invoke()
возвращает объект. При отладке я вижу, что объект относится к типу List, но попытка использовать его говорит мне, что у меня неверное приведение. Я предполагаю, что мне нужно использовать отражение, чтобы связать результат с правильным типом (то есть в этом примере, эквивалент (result as List<int>
).
У кого-нибудь есть указатели, которые могли бы помочь мне решить эту проблему? Извиняюсь, если это не ясно, я могу предоставить более подробную информацию, если вас спросят.
ТИА