首先看一段测试代码,自己写的

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. man OneMan = new man();
  6. var d = OneMan.CreatNewObject() as man ; // 这里是父类object转换为子类man,逆变
  7. Console.WriteLine("这是OneMan的类 "+OneMan); // 打印对象,默认打印对象的toString方法
  8. d.Speak();
  9. Console.ReadKey();
  10. }
  11. }
  12. public class man
  13. {
  14. public object CreatNewObject() // 这里是子类变为object父类,是协变
  15. {
  16. son g = new son();
  17. return g;
  18. }
  19. public override string ToString() // 覆写ToString方法后
  20. {
  21. string result = "I的值为{0},A为";
  22. return result;
  23. }
  24. public void Speak()
  25. {
  26. Console.WriteLine("this is a too much top!");
  27. }
  28. }
  29. public class son: man
  30. {
  31. }

测试结果
1.逆变和协变的条件是两者存在继承关系(或者说两者间有直线),两个不同的类是无法逆变或者协变的
2.直接打印类默认调用的是类的ToString方法,如果类没有重写ToString方法,默认调用的就是object的ToString方法

in 参数      : 表示参数可能会逆变
out 参数    : 表示参数可能会协变

一个比较好的实例
  1. // 第一种通过as转换类型来调用类中的方法
  2. var a1 = GetAnimal() as Animal;
  3. a1.Speak();
  4. // 第二种是通过反射将object中的方法调出来
  5. a1.GetType().GetMethod("Speak").Invoke(a1, null);
  6. // 第三种调用方法是通过dynamic关键字,在运行时将object转换为Animal类,直接调用类中的方法
  7. dynamic a2 = GetAnimal();
  8. a2.Speak(); // 注意,这个dynamic是没有智能提示的,要把字母全部输出正确才行
  9. Type aa = Assembly.Load("dogs").GetType("dogs.Class1"); // dogs是namespace名称,Class1是类名,GetType方法可以直接从命名空间下的类名取得该类的Type类型/属性
  10. dynamic bb = Activator.CreateInstance(aa);
  11. bb.Voice(); // Voice()是类中的方法
  12. a1.age.a = "jingya";
  13. a1.age.b = 23;
  14. Console.WriteLine(a1.age.a);
  15. Console.ReadKey();
  16. }
  17. static object GetAnimal() // c#中的很多返回值都是object,通过反射才能调用其中的方法,反射太麻烦了,不如用dynamic简单,也没有dynamic性能高
  18. {
  19. return new Animal() { name = "xiaolizi Animal " };
  20. }
  21. }
  22. public class Animal
  23. {
  24. public dynamic age { get; set; }
  25. public string name = "a ben mao ";
  26. public void Speak()
  27. {
  28. Console.WriteLine("this is a Animal Speak voice");
  29. }









C#-逆变 协变 反射 代码的更多相关文章

  1. 【温故而知新-万花筒】C# 异步编程 逆变 协变 委托 事件 事件参数 迭代 线程、多线程、线程池、后台线程

    额基本脱离了2.0 3.5的时代了.在.net 4.0+ 时代.一切都是辣么简单! 参考文档: http://www.cnblogs.com/linzheng/archive/2012/04/11/2 ...

  2. .NET中的逆变协变

    MSDN上的说法: 协变和逆变都是术语,前者指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型,后者指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型----------(注 ...

  3. [改善Java代码]警惕泛型是不能协变和逆变的

    什么叫做协变(covariance)和逆变(contravariance)? 在变成语言的类型框架中,协变和逆变是指宽类型和窄类型在某种情况下(如参数,泛型,返回值)替换或交换的特性,简单的说,协变是 ...

  4. C# 泛型的协变和逆变

    1. 可变性的类型:协变性和逆变性 可变性是以一种类型安全的方式,将一个对象当做另一个对象来使用.如果不能将一个类型替换为另一个类型,那么这个类型就称之为:不变量.协变和逆变是两个相互对立的概念: 如 ...

  5. 泛型类型的协变(covariant)和逆变

    官网:http://msdn.microsoft.com/zh-cn/library/dd799517.aspx 原文链接:http://book.51cto.com/art/201112/30857 ...

  6. .NET 4.0中的泛型的协变和逆变

    转自:http://www.cnblogs.com/jingzhongliumei/archive/2012/07/02/2573149.html 先做点准备工作,定义两个类:Animal类和其子类D ...

  7. 转载.NET 4.0中的泛型的协变和逆变

    先做点准备工作,定义两个类:Animal类和其子类Dog类,一个泛型接口IMyInterface<T>, 他们的定义如下:   public class Animal { } public ...

  8. C# 逆变与协变

    该文章中使用了较多的 委托delegate和Lambda表达式,如果你并不熟悉这些,请查看我的文章<委托与匿名委托>.<匿名委托与Lambda表达式>以便帮你建立完整的知识体系 ...

  9. 解读经典《C#高级编程》最全泛型协变逆变解读 页127-131.章4

    前言 本篇继续讲解泛型.上一篇讲解了泛型类的定义细节.本篇继续讲解泛型接口. 泛型接口 使用泛型可定义接口,即在接口中定义的方法可以带泛型参数.然后由继承接口的类实现泛型方法.用法和继承泛型类基本没有 ...

随机推荐

  1. Oracle里schema理解

    在Oracle中,一个用户就是一个Schema,表都是建立在Schema中的,也可以理解为每个用户拥有不同的表.一个用户想访问另外一个用户,也就是另外一个schema的表的时候,可以用 usernam ...

  2. Storm同时接收多个源(spout和bolt)

    参考: http://blog.csdn.net/nyistzp/article/details/51483779

  3. HDU 4365

    把涂色的格子按对称旋转至左上角. 当未涂色时,若要符合要求,则必须要求每一圈矩形都是上下左右对称的.注意是一圈的小矩形.对于N*N的阵,若最外层一圈的小矩形要符合要求,则(假设N%2==0)可以涂色的 ...

  4. [Tailwind] Apply mobile-first Responsive Classes in Tailwind

    In this lesson, we take a look at tailwind's mobile-first CSS architecture and learn how to apply st ...

  5. Shell简单介绍

    Shell是一种具备特殊功能的程序.它是介于使用者和linux 操作系统之核心程序(kernel)间的一个接口.为什么我们说 shell 是一种介于系统核心程序与使用者间的中介者呢?读过操作系统概论的 ...

  6. openssl之EVP系列之6---EVP_Encrypt系列函数编程架构及样例

    openssl之EVP系列之6---EVP_Encrypt系列函数编程架构及样例     ---依据openssl doc/crypto/EVP_EncryptInit.pod和doc/ssleay. ...

  7. 兔子-RadioButton和RadioGroup的关系

    RadioButton和RadioGroup的关系: 1.RadioButton表示单个圆形单选框.而RadioGroup是能够容纳多个RadioButton的容器 2.每一个RadioGroup中的 ...

  8. js 数组克隆

    在JS中,对于对象类型的变量的引用是通过类似C之类的"指针"的方式来操作的,及假设多个变量引用同一个对象,则随意一个变量对对象的操作都会影响到其他的变量. 这个可能不是非常明确,以 ...

  9. 2017-3-6 leetcode 118 169 189

    今天什么都没发生 ================================================= leetcode118 https://leetcode.com/problems ...

  10. Java-MyBatis-杂项: MyBatis 中 in 的用法2

    ylbtech-Java-MyBatis-杂项: MyBatis 中 in 的用法2 1.返回顶部 1. 一.简介 在SQL语法中如果我们想使用in的话直接可以像如下一样使用: select * fr ...