c# - 使用 Type 变量进行转换

标签 c# casting activator

下面的代码不起作用,我想知道如何将实例动态转换为运行时确定的类型?

Convert.ChangeType() 返回一个仍然需要转换的对象。所有对 Invoke()、GetConstructor() 或 Activator.CreateInstance() 的尝试也是如此,请参见下文。在某些时候我需要在代码中显式转换,我希望避免它或尽可能将它推出。

Type type = Type.GetType ("RandomChildClass");
Object obj = Activator.CreateInstance (type, new Object[]{ "argument" });
var instance = (type)obj;

我知道我可以创建一个方法来接受,但我仍然有同样的问题不知道如何用动态随机类型调用它 Casting a variable using a Type variable

最佳答案

不可能使用类型 来确定表达式的类型。 (泛型类型参数不同于值,因为它们被编码到类型系统中。)

变量的值来自运行时 代码执行,而表达式类型是编译时 构造。不用说,编译发生在代码运行之前,因此不可能使用变量进行转换。

Reflection (虽然笨重)或 dynamic (这基本上是更易于使用的反射)允​​许针对通用对象类型的表达式调用任意方法或访问属性/字段——这有时被称为“后期绑定(bind)”。但是,调用操作的表达式类型仍然是对象。

Interfaces可用于统一不同的类实现以实现正确的静态类型。然后可以将新创建​​的对象转换为需要的适用接口(interface)。与其他表达式一样,该类型是编译时构造(因此必须直接指定接口(interface)),但代码现在不受特定类的限制。

如果创建一个系统以便直接在静态类型 (C#) 代码中使用这些“动态类”,并且可以保证接口(interface)或将接口(interface)限制在一个较小的集合中,那么使用接口(interface)可能是最干净的方法:例如var myAction = (IMyAction)obj。否则,回退到动态访问 - 直接或在外观之后。

关于c# - 使用 Type 变量进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21345821/

相关文章:

c# - 将字符串数据转换为字典

c++ - reinterpret_cast 抛弃限定词

c# - 是否可以在非静态引用的程序集中的类型上调用 Activator.CreateInstance?

C# 程序集在子域中创建实例

c# - 具有很多方法的类

c# - 内部不能有带有动态代码的 [Authorize()]

c# - 是否可以在不中断调试的情况下在 Visual Studio 中查看执行函数列表?

java.lang.ClassCastException : android. widget.LinearLayout 无法转换为 android.widget

c# - C#动态指定类型

android - 在 Android 中嵌入 OSGi Felix 导致 UnsupportedOperationException : can't load this type of class file