Возможно, это проще:
object list = Activator.CreateInstance(listDataType,
new object[]{dataRowsCount});
Какой должен использовать правильный конструктор?
Дженерики и рефлексия - действительно боль в сочетании. Хак dynamic
здесь не более уродлив, чем установка его с помощью отражения (магическая строка в виде литерала, против непроверенного члена свойства), а dynamic
внутренне оптимизируется и кэшируется (для каждого типа), поэтому я бы не стал проблема с этим. Если вам нужно сделать больше, чем одно свойство, вы также можете использовать dynamic
, чтобы перейти к универсальному методу, чтобы минимизировать уродливое:
void Evil<T>(List<T> list, int capacity) {
list.Capacity = capacity;
// do other stuff
}
...
dynamic list = Activator.CreateInstance(listDataType);
Evil(list, dataRowsCount);
, который вызовет универсальный метод с правильным T
. Не стоит этого только для одного участника, но может оказаться полезным для более сложных сценариев.