C# - 动态类型(Dynamic Types)

本文关键字:Dynamic Types 类型 动态 | 更新日期: 2023-09-12 17:38:25

C# 4.0 (.NET 4.5) 引入了一种名为 dynamic 的新类型,该类型避免了编译时类型检查。dynamic类型在编译时转义类型检查;相反,它在运行时解析类型。

动态类型变量是使用 dynamic 关键字定义的。

Example: dynamic Variable

dynamic MyDynamicVar = 1;

在大多数情况下,编译器将动态类型编译为对象类型。 但是,动态类型变量的实际类型将在运行时解析。

Example: dynamic Type at run-time

dynamic MyDynamicVar = 1;
Console.WriteLine(MyDynamicVar.GetType());

输出:

System.Int32动态类型在

运行时根据分配的值更改类型。 下面的示例演示动态变量如何根据分配的值更改类型。

Example: dynamic

static void Main(string[] args)
{
    dynamic MyDynamicVar = 100;
    Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());
    MyDynamicVar = "Hello World!!";
    Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());
    MyDynamicVar = true;
    Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());
    MyDynamicVar = DateTime.Now;
    Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());
}

输出:

Value: 100, Type: System.Int32
Value: Hello World!!, Type: System.String
Value: True, Type: System.Boolean
Value: 01-01-2014, Type: System.DateTime

动态类型变量将隐式转换为其他类型。

Example: dynamic Type Conversion

dynamic d1 = 100;
int i = d1;
		
d1 = "Hello";
string greet = d1;
		
d1 = DateTime.Now;
DateTime dt = d1;

方法和参数

如果将类对象分配给动态类型,则编译器不会检查保存自定义类对象的动态类型的正确方法和属性名称。请考虑以下示例。

Example: Calling Methods

class Program
{
    static void Main(string[] args)
    {
        dynamic stud = new Student();
        stud.DisplayStudentInfo(1, "Bill");// run-time error, no compile-time error
        stud.DisplayStudentInfo("1");// run-time error, no compile-time error
        stud.FakeMethod();// run-time error, no compile-time error
    }
}
public class Student
{
    public void DisplayStudentInfo(int id)
    {
    }
}

在上面的示例中,C# 编译器不检查参数数、参数类型或不存在。它在运行时验证这些内容,如果无效,则引发运行时异常。请注意,动态类型不支持 Visual Studio 智能感知。 请注意,动态类型不支持 Visual Studio 智能感知。

动态语言运行时 (DLR) API 提供支持 C# 中的动态类型的基础结构。 有关 DLR 的详细信息,请访问 Dynamic Language Runtime Overview