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. 经常使用git命令集

    //创建本地仓库 mkdir git_root;cd git_root;git init // //查看 git status . git log git log ./kernel/driver/ g ...

  2. Android checkCallingPermission()方法返回值问题

    Android开发检查权限时,发现调用checkCallingPermission()总是返回值-1,而Binder.getCallingPid() == Process.myPid()又总是返回tr ...

  3. Yii Framework2.0开发教程(10)配合mysql数据库实现用户登录

    1.首先在mysql创建一个存用户的表格 create table test_user ( user_id bigint(20) unsigned not null auto_increment co ...

  4. java ResultSet 结果集处理 createStatement() 里参数的意义(第一弹)

    createStatement(int   resultSetType,int  resultSetConcurrency)参数一:结果集类型可取值:  1.ResultSet.TYPE_FORWOR ...

  5. Android学习之 WebView使用小结

    这段时间基于项目须要 在开发中与WebView的接触比較多,前段时间关于HTML5规范尘埃落定的消息出如今各大IT社区头版上,更有人说:HTML5将颠覆原生App开发 尽管我不太认同这一点 可是关于H ...

  6. C++ ofstream和ifstream具体的方法和C语言file说明

    ofstream是从内存到硬盘,ifstream是从硬盘到内存,事实上所谓的流缓冲就是内存空间; 在C++中,有一个stream这个类,全部的I/O都以这个"流"类为基础的,包含我 ...

  7. 安卓CTS官方文档之兼容性方案概览

    兼容性方案概览 安卓的兼容性方案让安卓手机生产商能够很容易就开发中可兼容的安卓设备(天地会珠海分舵注:可兼容什么呢?就是可以兼容标准google提供的安卓系统可以支持的功能,以防手机生产商把开源的安卓 ...

  8. MySQL在Windows和Linux减少数据库

    Linux减少数据库代码: 1,创建一个空数据库cddl mysql> create database cddl; Query OK, 1 row affected (0.00 sec) 2,还 ...

  9. IE6常见bug

    1.IE6怪异解析之padding与border算入宽高 原因:未加文档声明造成非盒模型解析 解决方法:加入文档声明<!doctype html> 2.IE6在块元素.左右浮动.设定mar ...

  10. MVC 使用jQuery上传文件

    在ASP.NET MVC Framework中,上传文件真是超级简单,看代码: View <formaction="<%=Url.Action("Process&quo ...