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. ajax——client访问webservice基本用法

    学前aps.net当我学会了使用服务器端的访问webservice方法,然后实现一个样本:web server模拟网上购物,今天学习asp.net ajax的时候学习到了client直接訪问webse ...

  2. [Asp.net]站点地图SiteMap

    原文:[Asp.net]站点地图SiteMap 引言 在项目中发现使用站点地图的控件,之前没总结过这方面的东西,就写了一个demo测试了一下,这里记录一下,算是总结吧. Web.sitemap < ...

  3. Asp.net MVC + EF + Spring.Net 项目实践3

    Asp.net MVC + EF + Spring.Net 项目实践 这一篇要整合Model层和Repository层,提供一个统一的操作entity的接口层,代码下载地址(博客园上传不了10M以上的 ...

  4. 利用EntityFramework获得双色球数据库

    原文 利用EntityFramework获得双色球数据库 双色球想必大家都很熟悉了,尽管屡买屡不中,但还是会买.以前就想过利用双色球的走势图得到双色球的数据库,至于得到数据库干什么倒没想过,不过对以往 ...

  5. Hack 语言学习/参考---1.3 Summary

    Summary Hack provides the following, non-exhaustive list of features: Ability to annotate function a ...

  6. SURF分析算法

    SURF分析算法 一个.整体形象     这个概念是积分图像Viola和Jones建议.随机位积分图像(i.j)的值原始图象的左上角随机点(i,j)级配相应的重点领域值的总和,其数学公式如图1所看到的 ...

  7. .NET:从 Mono、.NET Core 说起

    魅力 .NET:从 Mono..NET Core 说起 前段时间,被问了这样一个问题:.NET 应用程序是怎么运行的? 当时大概愣了好久,好像也没说出个所以然,得到的回复是:这是 .NET 程序员最基 ...

  8. select刷新后,保持选定状态,Cookies存储select选定状态信息

    //cookies存储select选定值,防止刷新后没了 window.onload = function () { var cooki = document.cookie; if (cooki != ...

  9. PHP 以POST方式提交XML、获取XML,最后解析XML

    以POST方式提交XML // Do a POST $data="<?xml version='1.0' encoding='UTF-8'?> <TypeRsp> & ...

  10. gtest框架

    解析gtest框架运行机制   1.前言 Google test是一款开源的白盒单元测试框架,据说目前在Google内部已在几千个项目中应用了基于该框架的白盒测试. 最近的工作是在搞一个基于gtest ...