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

Я читаю информацию из XML, который содержит тип объекта, который мне нужен, чтобы создать вместе с ним параметры конструктора.

Тип объекта фактически находится в другом проекте, в пространстве имен братьев и сестер. (Мне нужно создать объект Company.Project2.Type в классе Company.Project1.)

Я нашел этот вопрос, но он не обрабатывает параметры конструктора или тот факт, что он находится в другом пространстве имен.

Как я могу это сделать?

Изменить: Имя сборки и пространство имен по умолчанию не были установлены правильно в свойствах проекта.

Ответ 1

  • Вам нужно указать полное имя типа Type.GetType(), включая пространство имен, например. "Company.Project2.Type"
  • Если тип не находится в одной и той же сборке (или mscorlib), вам также нужно указать имя сборки, включая информацию о версии, если она строго указана. Например, для не строго типизированной сборки Company.Project2.dll вы можете указать "Company.Project2.Type, Company.Project2".
  • Чтобы вызвать конструктор с параметрами, вы можете вызвать Activator.CreateInstance(Type, Object[]) или получить точный конструктор, который вы хотите с помощью Type.GetConstructor(), а затем вызовите ConstructorInfo.Invoke().

Если это не поможет, пожалуйста, предоставьте дополнительную информацию.

Ответ 2

Если вы хотите динамически создать тип во время выполнения, метод Activator.CreateInstance сделает это за вас. Если вы выдаете тип с конструктором с параметрами, эта перегрузка будет делать это. Например, http://msdn.microsoft.com/en-us/library/wcxyzt4d.aspx

Я советую просмотреть перегрузки для лучшего соответствия.

Ошибка пространства имен не должна быть relavant - если DLL находится в каталоге bin или GAC, вы должны быть в порядке. Правила могут измениться, если узел сильно назван.

Не могли бы вы предоставить код snippiet кода, который не работает (используя метод, с которым вы связались)? Это + ошибки, которые вы видите, будут очень полезны! [Обновить] Быстрый пример с помощью Activator.CreateInstance, который обрабатывает конструкторы с параметрами.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            BaseProduct b =(BaseProduct)System.Activator.CreateInstance(Type.GetType("ConsoleApplication1.Product")
                ,new object[]{typeof(string)}, 
                new object[]{"123"}
            );
            //Activator..::.CreateInstance Method (Type, array<Object>[]()[], array<Object>[]()[])
        }
    }
    public class Product: BaseProduct{
        public  Product(string id) { 

        }
        public string Id {get;set;}


   }

    public abstract class BaseProduct {
        abstract public string Id { get; set; }
    }
}