C#-逆变 协变 反射 代码
首先看一段测试代码,自己写的
class Program{static void Main(string[] args){man OneMan = new man();var d = OneMan.CreatNewObject() as man ; // 这里是父类object转换为子类man,逆变Console.WriteLine("这是OneMan的类 "+OneMan); // 打印对象,默认打印对象的toString方法d.Speak();Console.ReadKey();}}public class man{public object CreatNewObject() // 这里是子类变为object父类,是协变{son g = new son();return g;}public override string ToString() // 覆写ToString方法后{string result = "I的值为{0},A为";return result;}public void Speak(){Console.WriteLine("this is a too much top!");}}public class son: man{}
// 第一种通过as转换类型来调用类中的方法var a1 = GetAnimal() as Animal;a1.Speak();// 第二种是通过反射将object中的方法调出来a1.GetType().GetMethod("Speak").Invoke(a1, null);// 第三种调用方法是通过dynamic关键字,在运行时将object转换为Animal类,直接调用类中的方法dynamic a2 = GetAnimal();a2.Speak(); // 注意,这个dynamic是没有智能提示的,要把字母全部输出正确才行Type aa = Assembly.Load("dogs").GetType("dogs.Class1"); // dogs是namespace名称,Class1是类名,GetType方法可以直接从命名空间下的类名取得该类的Type类型/属性dynamic bb = Activator.CreateInstance(aa);bb.Voice(); // Voice()是类中的方法a1.age.a = "jingya";a1.age.b = 23;Console.WriteLine(a1.age.a);Console.ReadKey();}static object GetAnimal() // c#中的很多返回值都是object,通过反射才能调用其中的方法,反射太麻烦了,不如用dynamic简单,也没有dynamic性能高{return new Animal() { name = "xiaolizi Animal " };}}public class Animal{public dynamic age { get; set; }public string name = "a ben mao ";public void Speak(){Console.WriteLine("this is a Animal Speak voice");}
C#-逆变 协变 反射 代码的更多相关文章
- 【温故而知新-万花筒】C# 异步编程 逆变 协变 委托 事件 事件参数 迭代 线程、多线程、线程池、后台线程
额基本脱离了2.0 3.5的时代了.在.net 4.0+ 时代.一切都是辣么简单! 参考文档: http://www.cnblogs.com/linzheng/archive/2012/04/11/2 ...
- .NET中的逆变协变
MSDN上的说法: 协变和逆变都是术语,前者指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型,后者指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型----------(注 ...
- [改善Java代码]警惕泛型是不能协变和逆变的
什么叫做协变(covariance)和逆变(contravariance)? 在变成语言的类型框架中,协变和逆变是指宽类型和窄类型在某种情况下(如参数,泛型,返回值)替换或交换的特性,简单的说,协变是 ...
- C# 泛型的协变和逆变
1. 可变性的类型:协变性和逆变性 可变性是以一种类型安全的方式,将一个对象当做另一个对象来使用.如果不能将一个类型替换为另一个类型,那么这个类型就称之为:不变量.协变和逆变是两个相互对立的概念: 如 ...
- 泛型类型的协变(covariant)和逆变
官网:http://msdn.microsoft.com/zh-cn/library/dd799517.aspx 原文链接:http://book.51cto.com/art/201112/30857 ...
- .NET 4.0中的泛型的协变和逆变
转自:http://www.cnblogs.com/jingzhongliumei/archive/2012/07/02/2573149.html 先做点准备工作,定义两个类:Animal类和其子类D ...
- 转载.NET 4.0中的泛型的协变和逆变
先做点准备工作,定义两个类:Animal类和其子类Dog类,一个泛型接口IMyInterface<T>, 他们的定义如下: public class Animal { } public ...
- C# 逆变与协变
该文章中使用了较多的 委托delegate和Lambda表达式,如果你并不熟悉这些,请查看我的文章<委托与匿名委托>.<匿名委托与Lambda表达式>以便帮你建立完整的知识体系 ...
- 解读经典《C#高级编程》最全泛型协变逆变解读 页127-131.章4
前言 本篇继续讲解泛型.上一篇讲解了泛型类的定义细节.本篇继续讲解泛型接口. 泛型接口 使用泛型可定义接口,即在接口中定义的方法可以带泛型参数.然后由继承接口的类实现泛型方法.用法和继承泛型类基本没有 ...
随机推荐
- 压力工具代码及epoll使用
服务器编程 P347的压力工具代码不错,对于epoll用的好,可以看.
- 去哪网实习总结:如何配置数据库连接(JavaWeb)
本来是以做数据挖掘的目的进去哪网的,结构却成了系统开发.. . 只是还是比較认真的做了三个月,老师非常认同我的工作态度和成果. .. 实习立即就要结束了.总结一下几点之前没有注意过的变成习惯和问题,分 ...
- POJ训练计划3422_Kaka's Matrix Travels(网络流/费用流)
解题报告 题目传送门 题意: 从n×n的矩阵的左上角走到右下角,每次仅仅能向右和向下走,走到一个格子上加上格子的数,能够走k次.问最大的和是多少. 思路: 建图:每一个格子掰成两个点,分别叫" ...
- oracle经常使用函数(2)
1.TRIM([ { { LEADING | TRAILING | BOTH }[ trim_character ]| trim_character} FROM ]trim_source) 函数 參数 ...
- listView 多个item布局
package kds.szkingdom.wo.android.adapter; import java.util.List; import android.content.Context; imp ...
- phpmyadmin客户端多服务器配置
修改libraries/config.default.php 545行,添加 $cfg['Servers']['2'] = $cfg['Servers'][$i];$cfg['Servers']['2 ...
- JavaScript-Tool:md5.js
ylbtech-JavaScript-Tool:md5.js 1.返回顶部 1.md5.js /* CryptoJS v3.1.2 code.google.com/p/crypto-js (c) 20 ...
- DB-MySQL:MySQL 序列使用
ylbtech-DB-MySQL:MySQL 序列使用 1.返回顶部 1. MySQL 序列使用 MySQL 序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想 ...
- MySQL 5.7 zip 文件安装过程
1.下载路径 https://dev.mysql.com/downloads/mysql/ 有账号登陆下载, 没有账号:no thanks;just start my download 2.解 ...
- jetty服务器数据源配置JNDI-Oracle,MySQL,SQLServer,DB2等 (转)
下载jetty 下载jetty服务器(8.1.0.RC2),解压到任意目录下 http://dist.codehaus.org/jetty/jetty-hightide-8.1.0/jetty-hig ...