C# 动态绑定

2018-01-22 17:09 更新

C# 动态绑定

动态绑定会将类型,成员和操作的解析过程从编译时延迟到运行时。

使用上下文关键字 dynamic 声明动态类型:


dynamic d = GetSomeObject();
d.OneMethod();

动态类型期望 d 的运行时类型具有OneMethod 方法。

由于d是动态的,编译器会将OneMethod绑定到d,直到运行时。

动态转化

动态类型具有来自所有其他类型的隐式转换:


int i = 7;
dynamic d = i;
long j = d; // No cast required (implicit conversion)

要使转换成功,动态对象的运行时类型必须可隐式转换为目标静态类型。

以下示例会抛出RuntimeBinderException,因为int不能隐式转换为short:


int i = 7;
dynamic d = i;
short j = d; // throws RuntimeBinderException

var vs dynamic

var 使编译器找出类型。

dynamic
使运行时确定类型。

为了显示:


dynamic x = "hello"; // Static type is dynamic, runtime type is string
var y = "hello";     // Static type is string, runtime type is string

int i = x; // Runtime error
int j = y; // Compile-time error

var 声明的变量的静态类型可以是动态的:


dynamic x = "hello";
var y = x; // Static type of y is dynamic
int z = y; // Runtime error

动态表达式

字段,属性,方法,事件,构造函数,索引器,运算符和转换都可以动态调用。

涉及动态操作数的表达式通常本身是动态的:


dynamic x = 2;
var y = x * 3; // Static type of y is dynamic

将动态表达式转换为静态类型会生成静态表达式:


dynamic x = 2;
var y = (int)x; // Static type of y is int

构造函数调用总是产生静态表达式。

在此示例中,x静态类型为StringBuilder:


dynamic capacity = 1;
var x = new System.Text.StringBuilder (capacity);
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号