Создать объект на основе данных Type
От: Popsodav  
Дата: 31.08.06 12:49
Оценка:
Такая ситуация. Есть функция, в неё передаётся класс Type от какого-то класса.
Можно ли в этой функции на основе данных Type создать объект передаваемого класса?
Re: Создать объект на основе данных Type
От: Lloyd Россия  
Дата: 31.08.06 12:51
Оценка:
Здравствуйте, Popsodav, Вы писали:

P>Такая ситуация. Есть функция, в неё передаётся класс Type от какого-то класса.

P>Можно ли в этой функции на основе данных Type создать объект передаваемого класса?

Activator.CreateInstance
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Создать объект на основе данных Type
От: Chardex Россия  
Дата: 31.08.06 12:59
Оценка: 1 (1)
Здравствуйте, Lloyd, Вы писали:

L>Activator.CreateInstance


Если волнует скорость создания и используется .NET 2.0, то можно использовать Dynamic Methods, создать метод и делегат на него, вот пример для конструктора без параметров:

            public delegate object ConstructorDelegate();


            DynamicMethod dmethod = new DynamicMethod("", typeof(object), new Type[] { }, type);
            ILGenerator igen = dmethod.GetILGenerator();
            if (!type.IsValueType)
            {
                ConstructorInfo ci = type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public, null, new CallingConventions(), Type.EmptyTypes, null);
                igen.Emit(OpCodes.Newobj, ci);
                igen.Emit(OpCodes.Castclass, type);
                igen.Emit(OpCodes.Ret);
            }
            else
            {
                LocalBuilder lb = igen.DeclareLocal(type);
                igen.Emit(OpCodes.Ldloca_S, lb);
                igen.Emit(OpCodes.Initobj, type);
                igen.Emit(OpCodes.Ldloc_0);
                igen.Emit(OpCodes.Box, type);
                igen.Emit(OpCodes.Ret);
            }
            
            _createInstance = (ConstructorDelegate)dmethod.CreateDelegate(typeof(ConstructorDelegate));
Re: Создать объект на основе данных Type
От: nikov США http://www.linkedin.com/in/nikov
Дата: 31.08.06 12:59
Оценка: 4 (1)
Здравствуйте, Popsodav, Вы писали:

P>Такая ситуация. Есть функция, в неё передаётся класс Type от какого-то класса.

P>Можно ли в этой функции на основе данных Type создать объект передаваемого класса?

Если есть открытый конструктор без параметоров (в т.ч. value-типы):
System.Activator.CreateInstance(type);


Если неизвестно, является ли конструктор без параметоров открытым:
System.Activator.CreateInstance(type, true);


Если есть конструктор с параметрами: соответствующие перегруженные версии метода Activator.CreateInstance.

Если неизвестно, какие конструкторы есть у класса, то все равно можно создать неинициализированный экземпляр (выделена память, заполнена нулями, но никакой конструктор не вызван):

System.Runtime.Serialization.FormatterServices.GetUninitializedObject(type);


Последним методом пользуются стандартные классы, которые занимаются десериализацией. Им необходимо создать "заготовку" объекта, после чего заполнить значения его полей.
Re: Создать объект на основе данных Type
От: nikov США http://www.linkedin.com/in/nikov
Дата: 31.08.06 13:12
Оценка:
Здравствуйте, Popsodav, Вы писали:

P>Такая ситуация. Есть функция, в неё передаётся класс Type от какого-то класса.

P>Можно ли в этой функции на основе данных Type создать объект передаваемого класса?

Посмотрите, эта тема уже неоднократно обсуждалась:

здесь
Автор: nikov
Дата: 03.08.06

здесь
Автор: nikov
Дата: 02.08.06

здесь
Автор: nikov
Дата: 11.07.06
Re[2]: Создать объект на основе данных Type
От: Popsodav  
Дата: 31.08.06 13:15
Оценка:
Спасибо за ответы.
Теперь следующий вопрос по теме...

Создал я объект:

object ConfigClass = Activator.CreateInstance(ConfigType);


А как мне теперь получить доступ к его содержимому (там только переменные хранятся).
Re[3]: Создать объект на основе данных Type
От: nikov США http://www.linkedin.com/in/nikov
Дата: 31.08.06 13:27
Оценка:
Здравствуйте, Popsodav, Вы писали:

P>Спасибо за ответы.

P>Теперь следующий вопрос по теме...

P>Создал я объект:


P>
P>object ConfigClass = Activator.CreateInstance(ConfigType);
P>


P>А как мне теперь получить доступ к его содержимому (там только переменные хранятся).


Либо приводите к нужному базовому типу/интерфейсу, либо с помощью отражения:

здесь
Автор: nikov
Дата: 26.07.06

здесь
Автор: nikov
Дата: 27.07.06

здесь
Автор: nikov
Дата: 13.07.06
Re[2]: Создать объект на основе данных Type
От: Аноним  
Дата: 31.08.06 13:25
Оценка:
ConfigType ConfigClass = Activator.CreateInstance(ConfigType) as ConfigType;

и пользуйтесь на здоровье
Успехов!
http://www.be-mobile.ru
также: программа для агенств персонала Домашний персонал


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[4]: Создать объект на основе данных Type
От: JohnG Россия  
Дата: 14.12.06 11:50
Оценка:
Здравствуйте, nikov, Вы писали:

P>>
P>>object ConfigClass = Activator.CreateInstance(ConfigType);
P>>


P>>А как мне теперь получить доступ к его содержимому (там только переменные хранятся).


N>Либо приводите к нужному базовому типу/интерфейсу, либо с помощью отражения:


У меня похожая проблема... Недавно только начал изучать дотнет,
поэтому крайне вероятно что где-то просто туплю, подскажите плиз (ссылки из предыдущих постов мне не помогли).
Так вот, пытаюсь сделать простейшую систему плагинов. Есть Основной модуль, есть базовый класс для плагинов и есть плагины,
наследующие от этого базового класса.

с помощью Activator.CreateInstance(myType) получаю object и не могу привести его к базовому классу.
просто тупо BaseClass bc = (BaseClass) myPluginObject — вылетает эксепшен Unable to cast.
myType основному модулю неизвестен, он динамически выбирается через pluginAssembly.GetTypes(),
BaseClass известен... где я туплю?

Ведь любой наследованный класс можно привести к базовому типу??
Re[5]: Создать объект на основе данных Type
От: JohnG Россия  
Дата: 14.12.06 12:10
Оценка:
Ээх блин, разобрался... Дело в том, что базовый класс у меня уже был прилинкован к основному модулю,
и я в добавок его еще раз динамически загружал через Assembly.LoadFrom. Убрал этот лоадфром и все заработало
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.