Создать экземпляр класса из строки

У меня есть метод С#, который создает новый экземпляр класса из строки, однако при запуске кода я получаю сообщение об ошибке.

obj = (ClassX)Activator.CreateInstance(Type.GetType("classPrefix_" + className));

ArgumentNullException не было обработано

Значение не может быть нулевым

Имя параметра: тип

Любая помощь по этой ошибке будет оценена по достоинству.


person Tim Cooper    schedule 19.02.2010    source источник
comment
Ну... Класс classPrefix_???? существует? Если это не так, Type.GetType вернет null...   -  person Sani Singh Huttunen    schedule 20.02.2010


Ответы (7)


Возможно, вам потребуется использовать полное имя сборки в качестве аргумента для Type.GetType.

eg AssemblyName.Namespace.ClassName

Документ MSDN по полным именам сборок

person Amal Sirisena    schedule 19.02.2010
comment
FQTN — это Namespace.Class,Assembly, т. е. имя сборки идет в конце и отделяется запятой (не спереди и отделяется точкой). - person itowlson; 20.02.2010
comment
Спасибо. Пришлось поставить Namespace.className - person Tim Cooper; 20.02.2010
comment
@Tim Cooper - Нет проблем, рад помочь @itowlson - Спасибо, я обновил свой ответ, чтобы исправить свою терминологию. - person Amal Sirisena; 20.02.2010

Возможно, вам просто не хватает пространства имен из имени класса.

person zincorp    schedule 19.02.2010

Работает на меня:

class ClassX {}
class classPrefix_x : ClassX {}

public class Program
{
    public static void Main()
    {
        string className = "x";
        ClassX obj = (ClassX)Activator.CreateInstance(Type.GetType("classPrefix_" + className));
        Console.WriteLine(obj);
    }
}

Результат:

classPrefix_x

Класс, который вы ищете, не должен быть определен. Вы уверены, что правильно написали?

person Mark Byers    schedule 19.02.2010

У вас, вероятно, нет типа «classPrefix_» плюс все, что у вас есть в className. Вызов Type.GetType() возвращает значение null, а CreateInstance создает исключение ArgumentNullException.

person Otávio Décio    schedule 19.02.2010

Это потому, что Type.GetType(classHere) ничего не нашел. Вы уверены, что нужное вам имя класса существует? Помните, что перед ним должно стоять пространство имен, если это возможно, и его нельзя будет найти во внешней сборке, если только оно уже не загружено в домен приложения.

person Nick Craver    schedule 19.02.2010

Похоже, Type.GetType("classPrefix_" + className) возвращает ноль.

Это возвращает null, когда он не может найти тип. Несколько возможных причин: отсутствует пространство имен или сборка, в которой находится класс, еще не загружена.

Документация API по этому методу, которая может дать некоторые дополнительные сведения. http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx

person aaronb    schedule 19.02.2010

Похоже, ваш вызов Type.GetType("classPrefix_" + className) возвращает null. Это вызывает ArgumentNullException при передаче в метод CreateInstance.

Вычислите "classPrefix_" + className и убедитесь, что у вас есть тип, который называется тем, что он оценивает.

При использовании Метод Type.GetType (т. е. полное имя типа, включая имя сборки и пространство имен).

person adrianbanks    schedule 19.02.2010