Это действительно поставило меня в тупик сегодня. Я уверен, что это просто, но... Вот мой пример кода:
using System;
using System.Collections;
namespace ConsoleApplication1
{
class Program
{
public ArrayList SomeProp { get; set; }
static void Main(string[] args)
{
// Get the Type of a property by reflection.
Type myPropType = typeof(Program).GetProperty("SomeProp").PropertyType;
// Create an instance of the determined Type.
var x = Activator.CreateInstance(myPropType);
// Now try to use that instance, passing to a method that takes a generic.
WhatAmI(x);
Console.ReadKey();
}
private static void WhatAmI<T>(T x)
{
Console.WriteLine("T is: " + typeof(T).FullName);
Console.WriteLine("x is: " + x.GetType().FullName);
}
}
}
Вывод здесь:
T is: System.Object
x is: System.Collections.ArrayList
В основном, что здесь происходит, у меня есть некоторая собственность в каком-то классе. Неважно, что/откуда это. Важной частью является то, что я получаю PropertyInfo для этого свойства. Оттуда я создаю новый экземпляр его типа с активатором.
Теперь, если я передам этот созданный экземпляр функции, которая принимает универсальный параметр, общий тип всегда будет восприниматься как объект, потому что Activator.CreateInstance() возвращает объект, поэтому «var x» является объектом, а не в этом случае, список массивов.
Мне нужно, чтобы общий тип был фактическим типом, в его случае «ArrayList».
Я знаю, что есть Activator.CreateInstance(), который я могу использовать вместо этого, но я не могу использовать тип (PropertyInfo.PropertyType) в угловых скобках для этого метода.
Я также мог бы просто привести возвращаемый объект, например:
myPropType x = (myPropType)Activator.CreateInstance(myPropType);
Но очевидно, что это не компилируется... К тому же, это все равно не будет действительным, потому что приведение - это время компиляции, и я не знаю тип до времени выполнения, но концептуально это то, что мне нужно...
Итак, я застрял с этим типом, но я не могу понять, как передать его методу WhatAmI() и сделать так, чтобы T был ArrayList, а не Object.
Идеи?