下面的代码不起作用,我想知道如何将实例动态转换为运行时确定的类型?
Convert.ChangeType() 返回一个仍然需要转换的对象。所有对 Invoke()、GetConstructor() 或 Activator.CreateInstance() 的尝试也是如此,请参见下文。在某些时候我需要在代码中显式转换,我希望避免它或尽可能将它推出。
Type type = Type.GetType ("RandomChildClass");
Object obj = Activator.CreateInstance (type, new Object[]{ "argument" });
var instance = (type)obj;
我知道我可以创建一个方法来接受
最佳答案
不可能使用类型
值 来确定表达式的类型。 (泛型类型参数不同于值,因为它们被编码到类型系统中。)
变量的值来自运行时 代码执行,而表达式类型是编译时 构造。不用说,编译发生在代码运行之前,因此不可能使用变量进行转换。
Reflection (虽然笨重)或 dynamic
(这基本上是更易于使用的反射)允许针对通用对象类型的表达式调用任意方法或访问属性/字段——这有时被称为“后期绑定(bind)”。但是,调用操作的表达式类型仍然是对象。
Interfaces可用于统一不同的类实现以实现正确的静态类型。然后可以将新创建的对象转换为需要的适用接口(interface)。与其他表达式一样,该类型是编译时构造(因此必须直接指定接口(interface)),但代码现在不受特定类的限制。
如果创建一个系统以便直接在静态类型 (C#) 代码中使用这些“动态类”,并且可以保证接口(interface)或将接口(interface)限制在一个较小的集合中,那么使用接口(interface)可能是最干净的方法:例如var myAction = (IMyAction)obj
。否则,回退到动态访问 - 直接或在外观之后。
关于c# - 使用 Type 变量进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21345821/