2015-11-03 4 views
1

Следующий код не компилируется в ОС Windows 10 Универсальное приложение, но делает в приложение .Net консоли (как с помощью Reflection):Использование CreateInstance в Windows 10 Универсальные приложения

string objType = "MyObjType"; 
var a = Assembly.GetExecutingAssembly(); 
var newObj = a.CreateInstance(objType); 

Казалось бы, универсальный Windows-приложения не содержат метода Assembly.GetExecutingAssembly(); и объекты Ассамблеи, похоже, не содержат CreateInstance.

Activator.CreateInstance имеет 16 перегрузок в .Net и только 3 в приложении A Win 10. Я ссылаюсь на расширения на рабочем столе.

Этот тип конструкции по-прежнему возможен в Windows 10, и если да, то как? Я пытаюсь создать экземпляр класса из строки, представляющей этот класс.

+0

Похоже, вы хотите получить тип, например. с 'Assembly.GetType (...)', а затем вызовите 'Activator.CreateInstance (Type)'. Какой сборкой является тип? –

+0

Тип находится в текущей сборке (почему я пытался вызвать GetExecutingAssembly), поэтому я мог бы это сделать, если бы смог получить исполняющую сборку. –

+1

Ну вы не можете использовать 'typeof (Foo) .Assembly' где' Foo' - это тип, в котором вы пишете код? –

ответ

2

Отражение в CoreCLR/Windows 10 и т. Д. Переместило довольно много того, что раньше было в Type, в TypeInfo. Вы можете использовать IntrospectionExtensions, чтобы получить TypeInfo за Type. Так, например:

using System.Reflection; 
... 

var asm = typeof(Foo).GetTypeInfo().Assembly; 
var type = asm.GetType(typeName); 
var instance = Activator.CreateInstance(type); 

Надеется, все это доступно для Вас (Документы могут быть немного запутанными, в моем опыте). Или вы могли бы просто использовать:

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

... либо с именем типа сборки-квалифицированной или именем типа в настоящее время, исполняющая сборку или mscorlib.

Смежные вопросы