NET反射的简单理解与代码示例

原创 2017年12月22日 10:23:53

我有一个梦想,是改变世界,这是很多技术人员的梦想;从小事做起,踏实做人做事,当身边的人或事因为自己能像更好的方向改变或发展的时候,那就是在改变世界,至花甲之时,可能我的梦想也无法实现,但我会一直追逐着他前行。我相信蝴蝶效应。荣耀的背后可这一道孤独。一起学习,一起进步。

反射是.NetFrameWork提供给我们的一个帮助类库Reflection.dll
它可以动态加载、解析、使用dll
普通方法我们使用时项目中添加引用,然后实例化使用;

反射基于“元数据”–metadata

Reflection.dll可以读取元数据,然后知道了dll中的方法、属性,则可以调用

以下代码实现了依赖接口,实现可配置、可扩展的动态的加载dll并调用方法(通过接口实现)
比如现在如下的代码实现的是sqlserver的操作,如果我编写了一个Oracle数据库操作的dll继承自IDBHelper,通过配置,那么我就可以实现不变更代码的情况下,实现了通过配置扩展了程序。

配置文件如下:

<add key="DbHelper" value="SqlserverHelperLib.SqlserverHelper,SqlserverHelperLib"/>

代码如下

using System;
using System.Configuration;
using System.Reflection;
using SqlserverHelperLib;
namespace Reflaction
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Reflection的学习");

            //--------------原始方法------------------
            //引用了SqlserverHelperLib.dll,如果去除了SqlServerHelperLib的引用,那么会导致对象无法创建
            var helperOld = new SqlserverHelper();
            helperOld.Query(@"old");
            Console.WriteLine();

            var config = ConfigurationManager.AppSettings["DbHelper"];
            var myClass = config.Split(',')[0];
            var myNnamspace = config.Split(',')[1];
            //动态加载dll
            var assembly = Assembly.Load(myNnamspace);
            //创建对象
            //不用引用SqlserverHelperLib.dll,因为SqlserverHelperLib.dll引用了IDbHelper接口,直接引用接口就行,也能够实现动态加载dll
           //基于类的完整名称(命名空间.类名)找出类型
            var type = assembly.GetType(myClass);
            //根据类型创建对象
            var myObj =Activator.CreateInstance(type);
            //强制转化为具体类型对象
            var helperReflection = (IDbHelperLib.IDbHelper) myObj;
            helperReflection.Query("Reflection");
            Console.ReadLine();
        }
    }
}

以下代码实现了不依赖接口,实现可配置、可扩展的动态的加载dll
调用普通方法、调用重载方法、调用私有方法、破坏单例

using System;
using System.Configuration;
using System.Reflection;

namespace Reflaction
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Reflection的学习");

            var config = ConfigurationManager.AppSettings["DbHelper"];
            var myClass = config.Split(',')[0];
            var myNnamspace = config.Split(',')[1];
            //动态加载dll
            var assembly = Assembly.Load(myNnamspace);
            //创建对象
            //不用引用SqlserverHelperLib.dll,因为SqlserverHelperLib.dll引用了IDbHelper接口,直接引用接口就行,也能够实现动态加载dll
            //基于类的完整名称(命名空间.类名)找出类型
            var type = assembly.GetType(myClass);
            //根据类型创建对象
            var myObj = Activator.CreateInstance(type);
            //获取\调用方法
            var method = type.GetMethod("Query");
            method.Invoke(myObj, new object[] { "不依赖接口Relection" });
            //获取\调用重载方法
            var method1 = type.GetMethod("Query1", new Type[] { typeof(string) });
            method1.Invoke(myObj, new object[] { "不依赖接口Relection1" });
            //获取\调用重载方法
            var method12 = type.GetMethod("Query1", new Type[] { typeof(int) });
            method12.Invoke(myObj, new object[] { 1 });
            //获取\调用私有方法
            var method2 = type.GetMethod("Query2", BindingFlags.NonPublic|BindingFlags.Public|BindingFlags.Instance);
            method2.Invoke(myObj, new object[] { "不依赖接口Relection" });
            //使用反射破坏单例--如下代码会实现一次对象的创建,不管你是否时单例,所以破坏了单例(因为单例时不可以创建对象的)
            //var myObj = Activator.CreateInstance(type,true);
            Console.ReadLine();
        }
    }
}

以下代码实现了基于反射实现的简单数据库访问层
调用类

var helper = new SqlserverHelper();
var people = helper.QueryDomain<People>();

数据库操作封装

public T QueryDomain<T>()
{
    var id = 1;
    //获取类型
    var type = typeof(T);
    //获取该类型对象
    var obj = (T)Activator.CreateInstance(type);
    foreach (var prop in type.GetProperties())
    {
        Console.WriteLine("属性名称:{0}", prop.Name);
    }
    var columns = string.Join(",", type.GetProperties().Select(prop => string.Format("[{0}]", prop.Name)));
    string sql = string.Format("SELECT {0} FROM {1} WHERE ID={2}", columns, type.Name, id);
    using (var con = new SqlConnection(ConStr))
    {
         var cmd = new SqlCommand(sql, con);
         con.Open();
         var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
         if (reader.Read())
         {
             //获取属性并赋值
             foreach (var prop in type.GetProperties())
             {
                  //获取属性名称
                  var propName = prop.Name;
                  prop.SetValue(obj, reader[propName], null);
                  Console.WriteLine("属性名称:{0},值:{1}", prop.Name, prop.GetValue(obj, null));
             }
         }
    }
    return obj;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Java反射机制简介及简单实例

一、什么是反射机制          简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,      那么就可以通过反射机制来获得类的所有信息。  二、哪里...
  • abudexiatian
  • abudexiatian
  • 2014年09月18日 17:20
  • 1556

[.Net码农]MVC——入门+最简单的小实例

http://blog.csdn.net/suneqing/article/details/41427037?utm_source=tuicool&utm_medium=referral ...
  • CrackLibby
  • CrackLibby
  • 2015年11月19日 22:22
  • 1115

一个例子让你了解Java反射机制

本文来自:blog.csdn.net/ljphhj JAVA反射机制: 通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我...
  • u011133213
  • u011133213
  • 2013年10月18日 21:53
  • 54724

一个关于反射的简单示例

  • 2011年08月03日 11:12
  • 30KB
  • 下载

关于反射的说明及代码示例

  • 2008年08月29日 16:03
  • 100KB
  • 下载

.net理解反射的一个很好的Demo

  • 2009年03月21日 12:55
  • 51KB
  • 下载

.Net一个反射的实例,深刻理解反射

反射的定义:审查元数据并收集关于它的类型信息的能力,简单理解反射就是把元数据里的类库反射出一个实例用于调用类库成员。         元数据简单理解就是.dll文件里的数据。       ...
  • newd_2011
  • newd_2011
  • 2012年07月20日 21:37
  • 3218

对于反射的理解(见注释)和简单例子

package com.hcj.test; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import ...
  • u011768325
  • u011768325
  • 2014年10月27日 11:24
  • 455

关于Field反射的简单理解

主要是简单的介绍一个小问题,小编水平有限。
  • jeekmary
  • jeekmary
  • 2016年10月18日 21:45
  • 108

反射的简单理解

java反射所需要的类 1.Class类:它的实例表示正在运行的java应用程序中的类和接口 2.Constructor类:提供关于类的单个构造方法的信息以及对他的访问权限。 3.Method类:提供...
  • zfj0301
  • zfj0301
  • 2011年02月24日 21:05
  • 76
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NET反射的简单理解与代码示例
举报原因:
原因补充:

(最多只允许输入30个字)