《c#高级编程》第4章C#4.0中的更改(六)——动态绑定
一、概念
下面是一些代码示例,说明C#动态绑定的上述特点:
1. 延迟确定类型
```
dynamic obj = GetDynamicObject(); // 获取动态对象
obj.DoSomething(); // 在运行时才能确定DoSomething方法是否存在及其参数类型和返回值类型
```
2. 动态调用成员
```
dynamic obj = GetDynamicObject(); // 获取动态对象
var result = obj.MethodName(arg1, arg2); // 在运行时动态调用MethodName方法,并传递arg1和arg2作为参数
```
3. 动态转换类型
```
dynamic obj = GetDynamicObject(); // 获取动态对象
string str = (string)obj; // 在运行时将动态对象转换为字符串类型
string[] arr = (string[])obj; // 在运行时将动态对象转换为字符串数组类型
```
4. 动态创建对象
```
dynamic obj = Activator.CreateInstance(type); // 在运行时动态创建指定类型的实例
obj.CallWebService(param1, param2); // 在运行时动态调用Web服务,并传递param1和param2作为参数
```
需要注意的是,这些示例只是简单地说明了C#动态绑定的特点,并不能代表所有的应用场景和使用方式。在实际开发中,需要根据具体需求和情况选择合适的技术和方案。
二、实例
C#动态绑定是指在运行时为对象添加成员或调用方法,而不需要在编译时预先声明这些成员或方法。这种机制可以让程序更加灵活,适应不同场景的需求。
以下是C#动态绑定的一些经典应用场景:
- 通过反射访问类型成员
using System;
using System.Reflection; // 定义一个Person类
class Person {
public string Name {get; set;}
public int Age {get; set;}
} class Program {
static void Main(string[] args) {
// 获取Person类型
Type personType = typeof(Person); // 获取Name属性信息
PropertyInfo nameProperty = personType.GetProperty("Name"); // 创建一个Person实例
var person = new Person(); // 设置Name属性值
nameProperty.SetValue(person, "Tom"); // 获取Age属性信息
PropertyInfo ageProperty = personType.GetProperty("Age"); // 设置Age属性值
ageProperty.SetValue(person, 20); // 输出Person实例信息
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
// 输出结果:Name: Tom, Age: 20
}
}
- 动态创建对象
using System; // 定义一个Person类
class Person {
public string Name {get; set;}
public int Age {get; set;}
} class Program {
static void Main(string[] args) {
// 动态创建Person实例
var person = Activator.CreateInstance<Person>(); // 设置Name和Age属性值
person.Name = "Tom";
person.Age = 20; // 输出Person实例信息
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
// 输出结果:Name: Tom, Age: 20
}
}
- 动态调用方法
using System;
using System.Reflection; // 定义一个Calculator类
class Calculator {
public int Add(int a, int b) {
return a + b;
} public int Substract(int a, int b) {
return a - b;
}
} class Program {
static void Main(string[] args) {
// 创建一个Calculator实例
var calculator = new Calculator(); // 获取Add方法信息
MethodInfo addMethod = calculator.GetType().GetMethod("Add"); // 调用Add方法并输出结果
int result = (int)addMethod.Invoke(calculator, new object[]{3, 5});
Console.WriteLine(result); // 输出结果:8 // 获取Substract方法信息
MethodInfo substractMethod = calculator.GetType().GetMethod("Substract"); // 调用Substract方法并输出结果
result = (int)substractMethod.Invoke(calculator, new object[]{6, 4});
Console.WriteLine(result); // 输出结果:2
}
}
《c#高级编程》第4章C#4.0中的更改(六)——动态绑定的更多相关文章
- javascript高级编程3第二章:在html中使用javascript
2.1 <script>元素 向html页面中插入javascript的主要方法,就是使用<script>元素.这个元素被加入到正式的html规范中.html4.01为< ...
- ASP.NET MVC5 高级编程 第5章 表单和HTML辅助方法
参考资料<ASP.NET MVC5 高级编程>第5版 第5章 表单和HTML辅助方法 5.1 表单的使用 5.1.1 action 和 method 特性 默认情况下,表单发送的是 HTT ...
- ASP.NET MVC5 高级编程 第3章 视图
参考资料<ASP.NET MVC5 高级编程>第5版 第3章 视图 3.1 视图的作用 视图的职责是向用户提供界面. 不像基于文件的框架,ASP.NET Web Forms 和PHP ,视 ...
- ASP.NET MVC5 高级编程 第2章 控制器
参考资料<ASP.NET MVC5 高级编程>第5版 第2章 控制器 控制器:响应用户的HTTP 请求,并将处理的信息返回给浏览器. 2.1 ASP.NET MVC 简介 MVC 模式中的 ...
- UNIX环境高级编程 第8章 进程控制
本章是UNIX系统中进程控制原语,包括进程创建.执行新程序.进程终止,另外还会对进程的属性加以说明,包括进程ID.实际/有效用户ID. 进程标识 每个进程某一时刻在系统中都是独一无二的,它们之间是用一 ...
- 【读书笔记】C#高级编程 第五章 泛型
(一)泛型概述 泛型不仅是C#编程语言的一部分,而且与程序集中的IL代码紧密地集成.泛型不仅是C#语言的一种结构,而且是CLR定义的.有了泛型就可以创建独立于被包含类型的类和方法了. 1.性能 泛型的 ...
- 第四章 在MVC4.0中对脚本以及样式表的引用变化
原文:http://www.cnblogs.com/xdotnet/archive/2012/07/21/aspnet40_webpage20.html 一.可以直接使用“~”,而无需使用Href对象 ...
- C#高级编程第1章-.NET体系结构
内容提要: (1)编译和运行面向对象.NET代码 (2)IL/MSIL(Microsoft Intermediate Language)中间语言的优点 (3)值类型与引用类型 (4)数据类型化 (5) ...
- C#高级编程第2章-核心C#
内容提要: 声明变量:变量的初始化和作用域:C#的预定义数据类型:在C#程序中使用条件语句.循环和跳转语句指定执行流:枚举:名称空间: Main()方法:基本命令行C#编译器选项:使用System.C ...
- UNIX环境高级编程 第13章 守护进程
守护进程daemon是一种生存周期很长的进程.它们通常在系统引导时启动,在系统关闭时终止.守护进程是没有终端的,它们一直在后台运行. 守护进程的特征 在Linux系统中,可以通过命令 ps -efj ...
随机推荐
- [VueJsDev] 日志 - BBTime-LOG
[VueJsDev] 目录列表 https://www.cnblogs.com/pengchenggang/p/17037320.html BBTime-LOG ::: details 目录 目录 B ...
- 【预训练语言模型】 使用Transformers库进行BERT预训练
基于 HuggingFace的Transformer库,在Colab或Kaggle进行预训练. 鉴于算力限制,选用了较小的英文数据集wikitext-2 目的:跑通Mask语言模型的预训练流程 一.准 ...
- day03-模块化编程
模块化编程 1.基本介绍 传统的非模块化开发有如下的缺点:(1)命名冲突(2)文件依赖 JavaScript代码越来越庞大,JavaScript引入模块化编程,开发者只需要实现核心的业务逻辑,其他都可 ...
- 中国十大热门网站榜中榜/Alexa综合排名TOP10(2015)
互联网企业是由网络为基础的经营,一般包括IT行业.电子商务.软件开发等. 商业时代催生网络时代兴起,互联网以其强大的信息存储.信息互通.信息处理等功能,风靡全世界,无处无有,轻松一点,信息就在你面前. ...
- dbVisualizer之中文乱码
在SQL Commander中,sql语句中如果有中文,显示是'口口口'. 解决办法如下: 在Tools->tool Properties->General->Appearance- ...
- iOS端创建ReactNative容器第一步:打出jsbundle和资源包
react-native的打包流程是通过执行react-native bundle指令进行的. 添加构建指令 修改RN项目中的package.json文件,先其中添加构建命令build-relea ...
- uni-app如何实现USB插入后自动弹出对应软件
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 最近碰到了一个奇葩需求,要用uni-app来实现usb接入设备的时候,让软件自动弹出来,这里给出我制作的过程和参考的各种思路,希望对大家有 ...
- KingbaseESV8R6全局临时表不能进行reindex操作
背景 我们经常遇到两种情况下会重建索引,reindex 1.索引崩溃,由于软件或硬件问题导致索引内数据失效而不可用. 2.索引膨胀,当索引膨胀会占用过多磁盘空间,reindex可以解决此问题. 对于临 ...
- GPTCache使用
1.概述 传统应用开发中,为了提升系统的查询性能,往往会在系统架构设计中加入缓存机制.在AI大模型领域,虽然功能非常强大,但是使用成本也是非常昂贵的,比如OpenAI的GPT-4按照token的个数来 ...
- 【Java】使用位运算完成数组中两个变量交换位置
1 /** 2 * 3 */ 4 package com.raliable.chapter_0; 5 /** 6 * @author : Administrator 7 * @date :2022年4 ...