我们继续C#基础知识的学习,这篇文章对前面基础知识学习的朋友有着举足轻重的作用;为了延续基础知识学习的热情,我编写了这篇特殊的文章。

本篇文章的中心是想借“.NET简谈反射(动态调用)”一文继续发挥下去,让朋友能一气呵成,到底反射能用在什么地方,究竟能起到多么高级的作用。

下面我就拿具体的例子讲解,不废话了请随我来;

1:必须具备的基础知识

C#接口:要想用反射进行高深的使用,必须先具备接口方面的基础,只有用接口了才能是系统真真的活起来。参考.NET简谈接口 一文;

C#委托、事件:在动态调用的过程中,我们难免要进行一些数据的传递,这样的传递是要用接口进行传递,我们不可能强耦合。参考.NET简谈事件与委托一文;

C#反射:这是最关键的一点,所有的东西都是围绕这个点在转,在我们下面的示例中,我们要动态的使用反射获取接口对象。参考.NET简谈反射(动态调用) 一文;

2:示例内容介绍

示例的主要内容是围绕着我们前面所学习的基础知识的做统一应用,以巩固我们的基础,使我们能在真正的项目中灵活运用,将自己提升到一个新的高度;

都知道接口是规范,都知道事件委托,都知道反射,但是我们都只是知道这些零零散散的知识点,我们怎么将这些小技术穿起来,形成坚实的代码结构;

示例要进行讲解的大概内容是这样的:我们定义一个接口,然后用对象去实现它,在我们使用的时候,我们动态的通过反射的去调用,但是反射的时候,我需要用接口进行确定唯一性,因为我们更本不知道谁实现了接口,所以接口的好处就出来了;

3:开始示例学习

定义接口:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace MainInterface
{
    /// <summary>
    /// 成功计算后的委托
    /// </summary>
    /// <param name="count">返回计算后的值</param>
    public delegate void AddHandler(int count);
    /// <summary>
    /// 添加方法接口
    /// </summary>
    public interface AddInterface
    {
 
        /// <summary>
        /// 计算结束后的事件
        /// </summary>
        event AddHandler AddEndEvent;
        /// <summary>
        /// 计算两个数的和
        /// </summary>
        /// <param name="i">number1</param>
        /// <param name="j">number2</param>
        void add(int i, int j);
    }
}
 

实现接口:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace TestDll
{
    public class Math : MainInterface.AddInterface
    {
 
        #region AddInterface 成员
 
        public event MainInterface.AddHandler AddEndEvent;
 
        public void add(int i, int j)
        {
            AddEndEvent(i + j);
        }
 
        #endregion
    }
}

具体调用:

 
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Diagnostics;
 
namespace Reflection
{
    class Program
    {
        static void Main(string[] args)
        {
            Assembly dll = Assembly.LoadFile(Environment.CurrentDirectory + "\\TestDll.dll");
 
            foreach (Type type in dll.GetTypes())
            {
                if (type.GetInterface("MainInterface.AddInterface") != null)
                {
                    MainInterface.AddInterface add = Activator.CreateInstance(type, true) as MainInterface.AddInterface;
                    add.AddEndEvent += new MainInterface.AddHandler(add_AddEndEvent);
                    add.add(10, 20);
 
 
                }
            }
 
        }
 
        static void add_AddEndEvent(int count)
        {
 
            Console.WriteLine("Invoke Method:\n" + count.ToString());
 
            Console.ReadLine();
        }
    }
}

来自王清培老师文章 这也是我们进入框架开发、系统开发必经之路;

.NET简谈——跨进高级编程门槛的必经之路的更多相关文章

  1. Atitit. 高级软件工程师and 普通的区别 高级编程的门槛总结

    Atitit.  高级软件工程师and 普通的区别 高级编程的门槛总结 1. 完备的知识体系 2 2. 编程理论/原理的掌握 2 1.1. 掌握常用的概念(ORM,IOC,AOP,event driv ...

  2. Atitit. 高级软件project师and 普通的差别 高级编程的门槛总结

    Atitit.  高级软件project师and 普通的差别 高级编程的门槛总结 1. 完备的知识体系 2 2. 编程理论/原理的掌握 2 1.1. 掌握经常使用的概念(ORM,IOC.AOP,eve ...

  3. 关于unix环境高级编程、Linux程序设计两部书浅谈

    unix环境高级编程的术语很多,概念内容,也很多,不过学习概念性质.标准规则类的东西,想必都是这样吧——需要进行拓展的内容很多. Linux程序设计,图文并茂,代码量够足,看起来,感觉难度还可以. l ...

  4. (十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  5. (八) 一起学 Unix 环境高级编程 (APUE) 之 信号

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  6. Hadoop学习笔记(7) ——高级编程

    Hadoop学习笔记(7) ——高级编程 从前面的学习中,我们了解到了MapReduce整个过程需要经过以下几个步骤: 1.输入(input):将输入数据分成一个个split,并将split进一步拆成 ...

  7. Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

    一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字 . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级 ...

  8. Linux C高级编程——网络编程基础(1)

    Linux高级编程--BSD socket的网络编程 宗旨:技术的学习是有限的,分享的精神是无限的. 一网络通信基础 TCP/IP协议簇基础:之所以称TCP/IP是一个协议簇,是由于TCP/IP包括T ...

  9. MPI简谈

    MPI简谈 MPI是分布式内存系统,区别于OpenMP和Pthreads的共享内存系统.MPI是一种基于消息传递的并行编程技术,是如今最为广泛的并行程序开发方法. MPI前世今生 MPI(Messag ...

随机推荐

  1. angular4过滤器

    Angular4中过滤器 一.大小写转换过滤器 uppercase将字符串转换为大写 lowercase将字符串转换为小写 <p>将字符串转换为大写{{str | uppercase}}& ...

  2. P2742 [USACO5.1]圈奶牛Fencing the Cows

    题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. 输入输出格式 输入 ...

  3. POJ 1064 Cable master (二分答案,G++不过,C++就过了)

    题目: 这题有点坑,G++过不了,C++能过. 条件:n个数据a[],分成k段,结果精度要求两位小数. 问题:每段最长为多少? 思路:因为精度要求为两位小数,我先把所有的长度a[]*100. 我们对答 ...

  4. 此请求的查询字符串的长度超过配置的 maxQueryStringLength 值

    异常详细信息: System.Web.HttpException: 此请求的查询字符串的长度超过配置的maxQueryStringLength 值. 我碰到此问题出现的原因是重写了HttpModule ...

  5. SpringCloud学习笔记(13)----Spring Cloud Netflix之Hystrix断路器的隔离策略

    说明 : 1.Hystrix通过舱壁模式来隔离限制依赖的并发量和阻塞扩散 2. Hystrix提供了两种隔离策略:线程池(THREAD)和信号量隔离SEMAPHORE). 1. 线程池隔离(默认策略模 ...

  6. POJ 3093 Margaritas on the River Walk(背包)

    题意 n个有体积的物品,问选取一些物品,且不能再继续选有多少方法? n<=1000 题解 以前的考试题.当时是A了,但发现是数据水,POJ上WA了. 把体积从小到大排序枚举没选的物品中体积最小的 ...

  7. Springboot+swagger2的接口文档开发

    一.创建一个SpringBoot项目 1. 2. 3. 4. 把web里的web选中,SQL里选择自己需要的,点击next 二.创建各项所需的controller,configure等 1. 项目布局 ...

  8. python+selenium进行简单验证码获取

    # _*_ coding:utf-8 _*_from PIL import Imagefrom selenium import webdriverimport pytesseractimport ti ...

  9. 洛谷 P1169 [ZJOI2007]棋盘制作 (悬线法)

    和玉蟾宫很像,条件改成不相等就行了. 悬线法题目 洛谷 P1169  p4147  p2701  p1387 #include<cstdio> #include<algorithm& ...

  10. Java多线程-基础知识

    一. 进程是执行中的程序,程序是静态的(我们写完以后不运行就一直放在那里),进程是执行中的程序,是动态概念的.一个进程可以有多个线程. 二. 多线程包含两个或两个以上并发运行的部分,把程序中每个这样并 ...