Преобразовать объект в тип на основе строкового значения, переданного в C # - PullRequest
5 голосов
/ 03 июня 2011

У меня есть требование, чтобы тип объекта [имя объекта] передавался как строковая переменная.Теперь, основываясь на переданном имени объекта, мне нужно создать этот тип объекта.Обратите внимание, что строковое значение содержит точное имя типа объекта.Я написал фрагмент кода, но он вызывает исключение.

Например -

string objectName = "EntityTest.Entity.OrderEntity";//Entity type name
object obj = new object();
object newobj = new object();
newobj = Convert.ChangeType(obj, Type.GetType(objectName));

Я делаю это, я получаю ошибку -> Object must implement IConvertible.

Моя сущностьOrderEntity уже реализовал интерфейс IConvertible.

Любая помощь / предложение с благодарностью.Есть ли другой способ, которым я могу создать объект, чтобы выполнить мое требование.

Ответы [ 2 ]

9 голосов
/ 03 июня 2011

В настоящее время вы пытаетесь преобразовать существующий объект, а не создаете один из подходящих типов.Предполагая, что ваш Type.GetType вызов работает, вы можете просто использовать:

Type type = Type.GetType(objectName);
object x = Activator.CreateInstance(type);

Несколько замечаний:

  • Type.GetType(string) требуется имя с указанием сборки если тип не находится либо в текущей выполняемой сборке, либо mscorlib
  • Activator.CreateInstance(Type) вызовет конструктор без параметров (который должен быть доступен);если вам нужно передать аргументы конструктору, доступны другие перегрузки .
3 голосов
/ 03 июня 2011

Ваша проблема в том, что вы создаете экземпляр object, а затем пытаетесь привести его к более конкретному типу (что не может быть).

Вам нужен способ вызова конструктора по умолчанию того типа, который вы пытаетесь создать.Взгляните на Activator.CreateInstance():

var type = Type.GetType(typeName);
var instance = Activator.CreateInstance(type);

Если тип не имеет конструктора по умолчанию, приведенный выше пример завершится ошибкой.В этом случае вам лучше всего использовать эту перегрузку (которая принимает массив объектов для использования в качестве параметров конструктора и затем пытается найти наилучшее совпадение)

...