Создать экземпляр объекта класса, имеющего имя в строковой переменной

Я не знаю, доступна ли вещь, которую я прошу, или нет, но я просто хочу знать, существует ли она и как она работает. Вот мой вопрос:

У меня есть 2-3 собственных класса моделей. Например, Клиент, Сотрудник и Продукт. Теперь у меня есть имя класса в строке. и на основе имени класса, входящего в строку, я должен создать его объект и вернуться к VIEW. Как я мог этого добиться?

Мне известен вариант оператора IF ELSE, но я хочу попробовать лучший, "динамический" способ...


person Dhwani    schedule 16.03.2013    source источник
comment
То, что вы ищете, - это отражение, но, как правило, если вы используете отражение, вы можете делать что-то неправильно (есть случаи, когда вам нужно отражение, но это не часто).   -  person Mike C.    schedule 16.03.2013


Ответы (4)


Наличие имени класса в строке недостаточно для создания его экземпляра. На самом деле вам понадобится полное пространство имен, включая имя класса, для создания объекта.

Предполагая, что у вас есть следующее:

string className = "MyClass";
string namespaceName = "MyNamespace.MyInternalNamespace";

Затем вы можете создать экземпляр этого класса, объект класса MyNamespace.MyInternalNamespace.MyClass, используя любой из следующих методов:

var myObj = Activator.CreateInstance(namespaceName, className);

или это:

var myObj = Activator.CreateInstance(Type.GetType(namespaceName + "." + className));

Надеюсь, это поможет, пожалуйста, дайте мне знать, если нет.

person Display Name    schedule 16.03.2013
comment
У меня есть имя класса в строке. так что в основном я не знаю тип класса. Тогда как я могу создать объект определенного класса. В MyClass myObj = я должен указать MyClass. но может быть любой класс. - person Dhwani; 18.03.2013
comment
Я сделал именно то, что вы пытаетесь сделать. Как я уже упоминал, помимо имени класса вам нужно пространство имен (в виде строки). Имея их обоих, вы можете создать экземпляр объекта этого класса, как я показал. Я отредактирую ответ, чтобы уточнить. Спасибо, что спросили - person Display Name; 18.03.2013
comment
Разве этот последний код не должен читаться так: var myObj = Activator.CreateInstance(Type.GetType(namespaceName + . + className)); (пропущена точка?) - person JCCyC; 10.03.2015
comment
эй, пожалуйста, помогите мне, у меня такая же проблема, но это решение не работает для меня, см. Вот пожалуйста - person Saeid; 26.07.2016

    string frmName = "frmCustomer";
    //WorldCarUI. is the namespace of the form
    Type CAType = Type.GetType("WorldCarUI." + frmName );
    var myObj = Activator.CreateInstance(CAType);
    Form nextForm2 = (Form)myObj;
    nextForm2.Show();

это работает..

С уважением, Ави

person Avinash    schedule 25.09.2013

Самый простой способ - использовать Активатор. Передайте имя класса в GetType и создайте новый экземпляр.

ClassInstance s1 = (ClassInstance)Activator.CreateInstance(Type.GetType("App.ClassInstance"));

public class ClassInstance
{
    public string StringData { get; set; }
}

С уважением, Ник

person Nik    schedule 16.03.2013

Класс Activator выполняет эту работу в .net, и этот метод очень полезен для сценариев типа внедрения зависимостей.

string NameSpace = "ProjectName.YourNameSpace";
string ProbeClass = "CLassName";

ObjectHandle ProberHandle = Activator.CreateInstance(NameSpace, ProbeClass) as ObjectHandle;
ClassName Prober = ProberHandle.Unwrap() as ClassName;

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

person amarnath chatterjee    schedule 06.08.2018