Преобразование строки в имя класса

У меня есть строковая переменная, которая представляет имя настраиваемого класса. Пример:

string s = "Customer";

Мне нужно создать arraylist клиентов. Итак, необходим синтаксис:

List<Customer> cust = new .. 

Как мне преобразовать строку s, чтобы иметь возможность создавать этот arraylist во время выполнения?

Ответ 1

Ну, во-первых, ArrayList не является общим... вы имели в виду List<Customer>?

Вы можете использовать Type.GetType(string), чтобы получить объект Type, связанный с типом по его имени. Если сборка не является mscorlib или текущим исполняемым типом, вам нужно будет указать имя сборки. В любом случае вам понадобится пространство имен.

Вам действительно нужен универсальный тип? Generics в основном обеспечивают безопасность во время компиляции, что явно не будет иметь большого значения, если вы найдете тип во время выполнения. Вы можете найти это полезным, хотя...

Type elementType = Type.GetType("Customer");
Type listType = typeof(List<>).MakeGenericType(new Type[] { elementType });

object list = Activator.CreateInstance(listType);

Если вам нужно что-либо сделать с этим списком, вам может потребоваться сделать больше общего отражения, хотя... например. для вызова общего метода.

Ответ 2

Это вопрос размышлений. Вам нужно найти тип, а затем создать экземпляр экземпляра, например:

Type hai = Type.GetType(classString,true);
Object o = (Activator.CreateInstance(hai));  //Or you could cast here if you already knew the type somehow

или, CreateInstance (assemblyName, className)

Однако вам нужно будет следить за конфликтами пространства имен/типов, но это поможет сделать простой сценарий.

Кроме того, оберните это в try/catch! Activator.CreateInstance страшно!