Такая ситуация. Есть функция, в неё передаётся класс Type от какого-то класса.
Можно ли в этой функции на основе данных Type создать объект передаваемого класса?
Здравствуйте, Popsodav, Вы писали:
P>Такая ситуация. Есть функция, в неё передаётся класс Type от какого-то класса. P>Можно ли в этой функции на основе данных Type создать объект передаваемого класса?
Здравствуйте, 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));
Здравствуйте, Popsodav, Вы писали:
P>Такая ситуация. Есть функция, в неё передаётся класс Type от какого-то класса. P>Можно ли в этой функции на основе данных Type создать объект передаваемого класса?
Если есть открытый конструктор без параметоров (в т.ч. value-типы):
System.Activator.CreateInstance(type);
Если неизвестно, является ли конструктор без параметоров открытым:
System.Activator.CreateInstance(type, true);
Если есть конструктор с параметрами: соответствующие перегруженные версии метода Activator.CreateInstance.
Если неизвестно, какие конструкторы есть у класса, то все равно можно создать неинициализированный экземпляр (выделена память, заполнена нулями, но никакой конструктор не вызван):
Последним методом пользуются стандартные классы, которые занимаются десериализацией. Им необходимо создать "заготовку" объекта, после чего заполнить значения его полей.
Здравствуйте, Popsodav, Вы писали:
P>Такая ситуация. Есть функция, в неё передаётся класс Type от какого-то класса. P>Можно ли в этой функции на основе данных Type создать объект передаваемого класса?
Посмотрите, эта тема уже неоднократно обсуждалась:
P>>А как мне теперь получить доступ к его содержимому (там только переменные хранятся).
N>Либо приводите к нужному базовому типу/интерфейсу, либо с помощью отражения:
У меня похожая проблема... Недавно только начал изучать дотнет,
поэтому крайне вероятно что где-то просто туплю, подскажите плиз (ссылки из предыдущих постов мне не помогли).
Так вот, пытаюсь сделать простейшую систему плагинов. Есть Основной модуль, есть базовый класс для плагинов и есть плагины,
наследующие от этого базового класса.
с помощью Activator.CreateInstance(myType) получаю object и не могу привести его к базовому классу.
просто тупо BaseClass bc = (BaseClass) myPluginObject — вылетает эксепшен Unable to cast.
myType основному модулю неизвестен, он динамически выбирается через pluginAssembly.GetTypes(),
BaseClass известен... где я туплю?
Ведь любой наследованный класс можно привести к базовому типу??
Ээх блин, разобрался... Дело в том, что базовый класс у меня уже был прилинкован к основному модулю,
и я в добавок его еще раз динамически загружал через Assembly.LoadFrom. Убрал этот лоадфром и все заработало