Использование CreateInstance в универсальных приложениях Windows 10

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

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

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

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

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


person Paul Michaels    schedule 03.11.2015    source источник
comment
Похоже, вы хотите получить тип, например. с Assembly.GetType(...), а затем позвоните Activator.CreateInstance(Type). Тип в какой сборке?   -  person Jon Skeet    schedule 03.11.2015
comment
Тип находится в текущей сборке (почему я пытался вызвать GetExecutingAssembly), поэтому я определенно мог бы это сделать, если бы мог получить исполняемую сборку.   -  person Paul Michaels    schedule 03.11.2015
comment
Разве вы не можете использовать typeof(Foo).Assembly, где Foo — это тип, в котором вы пишете код?   -  person Jon Skeet    schedule 03.11.2015
comment
Спасибо, Джон - хотя это само по себе не работает, вы указали мне правильное направление. По сути, ключевой командой является Type.GetType(), которая принимает строку и возвращает тип. Я предполагаю, что это мера безопасности, чтобы убедиться, что вы можете отражать только свою собственную сборку.   -  person Paul Michaels    schedule 03.11.2015
comment
См. мой ответ - я считаю, что вы все еще можете размышлять над другими сборками, но отражение несколько сдвинулось.   -  person Jon Skeet    schedule 03.11.2015


Ответы (1)


Отражение в 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.

person Jon Skeet    schedule 03.11.2015