《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 ...
随机推荐
- nexus 莫名错误 两个解决的地方
unknown org.sonatype.nexus.reposibory.httpclient.internal.httpclientfaceImpl 也没太解决,先记录下来吧
- InputNumber 不能输入点 viewDesign 需求是 只能是整数
<InputNumber ref="xxxRef" v-model="xxx" :disabled="xxx" style=" ...
- Vue 动态插入组件 用js函数的方式
Vue 动态插入组件 用js函数的方式 第一步 import vue组件 第二步 Vue把组件扩展进去 第三步 创建实例 第四步 将组件的el挂载到document.body上 第五步 设置组件内部d ...
- PRD(产品需求文档)与SRS(软件需求规格说明书)的区别
需求分析是软件开发过程中很重要的一个环节,目前需求分析完成后输出的文档有2种体系,一个是SRS(Software Requirements Specification,软件需求规格说明书),一个是PR ...
- Android CheckBox控件去除图标 样式改造
有个UI需要实现下面这种效果,但我之前是使用的CheckBox,本着能改就改的原则,还是把CheckBox改造一份,终于是实现了图中的效果 过程 1.去除CheckBox的左侧图标 CheckBox默 ...
- day09-数据格式化&验证以及国际化
数据格式化&验证以及国际化 1.数据格式化 1.1基本介绍 说明:在我们提交数据(比如表单时),SpringMVC 是怎样对提交的数据进行转换和处理的 基本数据类型可以和字符串之间自动进行转换 ...
- drf(认证、权限、频率)
一. 认证组件 1. 流程 1. 写一个类,继承BaseAuthentication,重写authenticate,认证的逻辑写在里面. 认证通过,返回两个值,一个值最终给了包装以后的request对 ...
- 使用Go语言开发一个短链接服务:三、项目目录结构设计
章节 使用Go语言开发一个短链接服务:一.基本原理 使用Go语言开发一个短链接服务:二.架构设计 使用Go语言开发一个短链接服务:三.项目目录结构设计 使用Go语言开发一个短链接服务:四.生成 ...
- 一些 IL 语言解释
跳转指令集合 Public field Static Beq 如果两个值相等,则将控制转移到目标指令. Public field Static Beq_S 如果两个值相 ...
- java读写txt
/** * 传入txt路径读取txt文件 * * @param txtPath * @return 返回读取到的内容 */ public String readTxt(String txtPath) ...