Как мне создать экземпляр из строки в C #? - PullRequest
12 голосов
/ 15 марта 2009

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

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

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

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

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

Ответы [ 2 ]

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

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

2 голосов
/ 15 марта 2009

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

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

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

Не могли бы вы предоставить фрагмент кода кода, который не работает (используя метод, на который вы ссылались)? Это + ошибки, которые вы видите, будут очень полезны! [Обновить] Быстрый пример с использованием 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; }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...