Как создать экземпляр из строки в С#?
Я читаю информацию из 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; }
}
}