1 背景

在项目中使用反射,反射出某类型的所有属性(Property)和对应的属性值。起初为了性能考虑在模块首次加载就反射类型的所有属性并将其存入字典。根据一般的编程规范——基于接口编程,所以首次传入的反射类型是一个接口。所以程序必然出现了异常否者就没有此文了。

2 重现实验代码

代码其实很简单,主要是比较接口反射和类反射的不同

interface ILevel0
{
  string LevelZero { get; set; }
} interface ILevel1 : ILevel0
{
  string LevelOne { get; set; }
} class Base0
{
  public string BaseZero { get; set; }
} class Base1 : Base0
{
  public string BaseOne { get; set; }
}
class Base : Base1, ILevel1
{ #region private string level0; private string level1; #endregion #region [property] public string LevelOne { get { return level1; } set { level1 = value; } } public string LevelZero
{
  get { return level0; }   set { level0 = value; }
} public string BaseClass { get; set; } #endregion [property]
}
 static void Main(string[] args)

 {

 Base bas = new Base

 {

 BaseClass = "BaseClass",

 LevelOne = "level1",

 LevelZero = "level0",

 BaseOne = "BaseOne",

 BaseZero = "BaseZero"

 };

 ILevel0 level0 = bas;

 ILevel1 level1 = bas;

 Base0 base0 = bas;

 Base1 base1 = bas;

 RetriveProperty(typeof(ILevel0));

 RetriveProperty(typeof(ILevel1));

 RetriveProperty(typeof(Base0));

 RetriveProperty(typeof(Base1));

 RetriveProperty(typeof(Base));

 RetriveProperty(level0.GetType(), bas);

 //RetriveProperty(level1.GetType(), bas);

 //RetriveProperty(base0.GetType(), bas);

 //RetriveProperty(base1.GetType(), bas);

 //RetriveProperty(bas.GetType(), bas);

 Console.ReadKey();

 }

 public static void RetriveProperty(Type type, Object obj)

 {

 Console.WriteLine("-------{0}--------", type.Name);

 var property = type.GetProperties();

 foreach (var pro in property)

 {

 Console.WriteLine("{0}-{1}", pro.Name, pro.GetValue(obj, null));

 }

 Console.WriteLine();

 }

 public static void RetriveProperty(Type type)

 {

 Console.WriteLine("-------{0}--------", type.Name);

 var property = type.GetProperties();

 foreach (var pro in property)

 {

 Console.WriteLine("Property:{0}", pro.Name);

 }

 Console.WriteLine();

 }

3 实验结果

接口Level1反射并没有出现接口Level0的属性

基类Base1反射出现了基类Base0中定义的属性

所有指向类型Base的引用反射属性的结果都是相同的

4 总结

接口只是作为一种约定,没有实现类型的继承机制

.NET接口和类 反射的差异性发现的更多相关文章

  1. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  2. JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]

    类的继承 Java只支持单继承,不允许多重继承- 一个子类只能有一个父类- 一个父类可以派生出多个子类这里写图片描述子类继承了父类,就继承了父类的方法和属性.在子类中,可以使用父类中定义的方法和属性, ...

  3. Java中的类反射

    一.反射的概念 : 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...

  4. 如何利用缓存机制实现JAVA类反射性能提升30倍

    一次性能提高30倍的JAVA类反射性能优化实践 文章来源:宜信技术学院 & 宜信支付结算团队技术分享第4期-支付结算部支付研发团队高级工程师陶红<JAVA类反射技术&优化> ...

  5. (转)beanUtil接口和类(有空的时候去看,到时候删除这个说明)

    Jakarta Commons项目提供了相当丰富的API,我们之前了解到的Commons Lang只是众多API的比较核心的一小部分而已.Commons下面还有相当数量的子项目,用于解决各种各样不同方 ...

  6. Java---类反射(1)---类反射入门和基础

    什么是类反射 ☆什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方 ...

  7. List接口实现类-ArrayList、Vector、LinkedList集合深入学习以及源代码解析

    学习List接口实现类 ArrayList  Vector  LinkedList List接口的实现类中最经常使用最重要的就是这三个:ArrayList.Vector.LinkedList. JDK ...

  8. 抽象类 abstract 和 接口 interface 类的区别

    在看一些框架的优秀改良时,都会设计一层base层,并且 base里面一般都是 abstract 类,然后 就找了为什么做的原因.发现: PHP5支持抽象类和抽象方法.抽象类不能直接被实例化,你必须先继 ...

  9. BeanUtils接口和类

      Jakarta Commons项目提供了相当丰富的API,我们之前了解到的Commons Lang只是众多API的比较核心的一小部分而已.Commons下面还有相当数量的子项目,用于解决各种各样不 ...

随机推荐

  1. ENode 2.0

    ENode 2.0 - 介绍一下关于ENode中对Command的调度设计 摘要: CQRS架构,C端的职责是处理从上层发送过来的command.对于单台机器来说,我们如何尽快的处理command呢? ...

  2. vistual studio 2012 安装失败,提示Microsoft Vistual Studio 2012 Devenv找不到元素,等错误信息

    在安装vistual studio 2012过程中,出现安装失败,提示Microsoft Vistual Studio 2012 Devenv找不到元素,等错误信息 解决方法是更新相应的server补 ...

  3. IE6下jquery ajax报error的原因

    用jquery ajax()方法,在其他浏览都通过,IE7以上都通过,唯独在ie6不行. 我这边的解决方案是:必须保证ajax里面的所有数字为小写,ie6对大小写敏感. 错误: $.ajax({ ur ...

  4. centos6的安装

      centos6的安装,一步一图,有图有真相     打开虚拟机VMware,点击文件,选择[新建虚拟机],如图所示

  5. Url.Content

    Url.Content了,Url是ViewPage的一个对象,它最常用的一个方法就是Content,它的功能是返回某个文件的路径.一般情况下,在使用了ASP.NET MVC后,目录结构变得有点诡异,像 ...

  6. 2.2 LINQ中使用from子句指定数据源

    数据源是LINQ查询中必不可少的元素,数据源是实现泛型接口IEnumerable<T>或IQueryable<T>的类对象. 可以将IEnumerable<T>简单 ...

  7. leetcode第15题--3Sum

    Problem: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Fi ...

  8. JavaScript一个类继承中实现

    JavaScript类是默认原型对象继承: var Person = function() { this.name = "people"; this.hello = functio ...

  9. CRT

    G - 中国剩余定理 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit S ...

  10. git简单教材

    0)初始化 $ git config --global user.name "xxx" $ git config --global user.email "xxx@gma ...