下面的代码不起作用,我想知道如何将实例动态转换为在运行时确定的类型?
Convert.ChangeType()返回仍需要强制转换的Object。调用Invoke(),GetConstructor()或Activator.CreateInstance()的所有尝试也是如此,请参见下文。在某些时候,我需要显式地强制转换代码,我希望避免它或将其尽可能地推出。
Type type = Type.GetType ("RandomChildClass");
Object obj = Activator.CreateInstance (type, new Object[]{ "argument" });
var instance = (type)obj;
我知道我可以创建一个接受<T>的方法,但是仍然会有一个不知道如何使用动态随机类型调用它的问题,即使用Type变量强制转换变量
无法使用Type
值来确定表达式的类型。(泛型类型参数与值不同,因为它们被编码到类型系统中。)
变量的值来自运行时代码执行,而表达式类型是编译时构造。不用说,编译是在代码运行之前发生的,因此不可能使用变量进行强制转换。
反射(有点笨拙)或dynamic
(基本上更容易使用反射)允许调用任意方法或针对通用对象类型的表达式访问属性/字段-有时称为“后期绑定”。但是,在其上调用操作的表达式的类型仍然是对象。
接口可用于统一不同的类实现,以进行正确的静态类型化。然后,新创建的对象可以强制转换为适用的接口。就像其他表达式一样,类型是编译时构造(因此必须直接指定接口),但是代码现在不受特定类的限制。
如果创建的系统可以直接在静态类型(C#)代码中使用这些“动态类”,并且可以保证接口或将接口限制在较小的范围内,那么使用接口可能是最干净的方法:例如var myAction = (IMyAction)obj
。否则,请退回动态访问-直接或直接进入立面。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句