Вместо того, чтобы ставить под сомнение ваши мотивы или пытаться отменить то, что вы делаете - я просто собираюсь ответить на вопрос в заголовке.
Если у вас есть экземпляр типа listElemType
, который представляет типаргумент, который должен быть передан типу List<>
во время выполнения:
var listInstance = (IList)typeof(List<>)
.MakeGenericType(listElemType)
.GetConstructor(Type.EmptyTypes)
.Invoke(null);
И затем вы можете работать со списком через реализацию интерфейса IList
.
Или, действительно,вы можете остановиться на вызове MakeGenericType
и использовать тип, который он генерирует при вызове Activator.CreateInstance
- как в ответе Даниэля Хилгарта.
Затем, учитывая объект target
, свойство которого вы хотите установить:
object target; //the object whose property you want to set
target.GetType()
.GetProperty("name_of_property") //- Assuming property is public
.SetValue(target, listInstance, null); //- Assuming .CanWrite == true
// on PropertyInfo
Если вы не знаете свойств типа, представленного target
, то вам нужно использовать
target.GetType().GetProperties();
, чтобы получить все открытые свойства этого экземпляра.Однако простое создание экземпляра списка на самом деле не поможет вам в этом - у вас должно быть более общее решение, способное справиться с любым типом.Если только вы не будете специально ориентироваться на типы списков.
Похоже, вам может понадобиться общий интерфейс или база ...