【问题标题】:Using CreateInstance in Windows 10 Universal Apps在 Windows 10 通用应用程序中使用 CreateInstance
【发布时间】:2015-11-04 02:35:07
【问题描述】:

以下代码不能在 Windows 10 通用应用程序中编译,但可以在 .Net 控制台应用程序中编译(均使用反射):

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

似乎通用 Windows 应用程序不包含方法 Assembly.GetExecutingAssembly(); Assembly 对象似乎也不包含CreateInstance

Activator.CreateInstance 在 .Net 中有 16 个重载,而在 Win 10 应用程序中只有 3 个。我指的是桌面扩展。

这种类型的构造在 Windows 10 中是否仍然可行?如果可以,如何实现?我要做的是从代表该类的字符串创建一个类的实例。

【问题讨论】:

  • 听起来你想获取类型,例如与Assembly.GetType(...),然后调用Activator.CreateInstance(Type)。类型在哪个程序集中?
  • 类型在当前程序集中(为什么我试图调用 GetExecutingAssembly),所以如果我能得到正在执行的程序集,我当然可以这样做。
  • 那么你不能使用typeof(Foo).Assembly Foo 是你编写代码的类型吗?
  • 谢谢,乔恩 - 虽然这本身不起作用,但您为我指明了正确的方向。基本上,关键命令是 Type.GetType() ,它接受一个字符串并返回一个类型。我认为这是一种安全措施,以确保您只能反映自己的程序集。
  • 查看我的答案 - 我相信您仍然可以对其他程序集进行反思,但反思已经发生了一些变化。

标签: c# .net windows-10 win-universal-app windows-10-desktop


【解决方案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 中的类型名称。

【讨论】:

    猜你喜欢
    • 2016-04-20
    • 2015-11-09
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 2015-11-30
    相关资源
    最近更新 更多