C#博客随笔之七:反射初体验

这篇博客主要要讲的是反射在C#编程中的一些使用:

主要目的是为了让程序能动态识别插件并加载到主程序当中。 这个功能是一个实用的功能。

首先,我们需要定义一个接口

public interface IPlug
    {

        /// <summary>
        /// 获得版本号
        /// </summary>
        /// <returns>返回版本</returns>
        string GetVersion();
        /// <summary>
        /// 获得插件作者
        /// </summary>
        /// <returns></returns>
        string GetAuthor();
        /// <summary>
        /// 获得插件名
        /// </summary>
        /// <returns></returns>
        string GetName();
        /// <summary>
        /// 获得程序图标
        /// </summary>
        /// <returns></returns>
        System.Windows.Media.Imaging.BitmapImage GetImage();
        /// <summary>
        /// 在主程序加载的时候执行,用来产生用户提醒
        /// </summary>
        void Initial();

        string GetDescribe();
        UserControl GetPage();
    }

这个接口定义了插件需要实现的函数,这些方法是需要插件自己具体实现的,具体的方法描述,都在注释里面了。

GetPage方法是调用插件的页面并返回。

我们在编写插件的时候,就应该在插件的页面这么写:

public partial class Viewscore : UserControl,IPlug

后边要继承接口Iplug并予以实现

差不多就是这样

public string GetVersion()
        {
            return "1.0.0";
        }

        public string GetAuthor()
        {
            return "TJUBOX";
        }

        public string GetName()
        {
            return "插件测试";
        }

        public BitmapImage GetImage()
        {
            CommonFuncClass cfc = new CommonFuncClass();       //这是从资源文件中加载图片
            return cfc.BitmapToBitmapImage(global::Plugin_EWebScore.Properties.Resources.logo);
        }

        public void Initial()
        {

        }

        public string GetDescribe()
        {
            return "这是一个插件测试";
        }

        public UserControl GetPage()
        {
            return this;
        }

接下来最关键的部分到了,就是怎么样在主程序中发现插件的存在

 public class PluginManager
    {
        public PluginManager()
        {
            GetPlugList();
            GetPlugInfo();
        }
        public ArrayList plugins = new ArrayList();
        //获取插件目录
        string[] files = Directory.GetFiles(Configuration.PluginRoot);
        List<string> dllfile = new List<string>();
        object selObj;
        public void GetPlugList()
        {
            //遍历目录中的文件
            foreach (string file in files)
            {
                //如果文件名以dll结尾
                if (file.ToUpper().EndsWith(".DLL"))
                {
                    Assembly ab = Assembly.LoadFile(file);
                    Type[] types = ab.GetTypes();
                    foreach (Type t in types)
                    {
                        //如果他实现了IPlug接口
                        if (t.GetInterface("IPlug") != null)
                        {
                            //那么将他加入到插件列表
                            plugins.Add(ab.CreateInstance(t.FullName));
                        }
                    }
                }
            }
        }
        public ObservableCollection<PlugInfo> plugList = new ObservableCollection<PlugInfo>();
        public void GetPlugInfo()
        {
            for (int i = 0; i < plugins.Count; i++)
            {
                try
                {
                    //获取插件信息
                    MethodInfo name;
                    MethodInfo version;
                    MethodInfo author;
                    MethodInfo logo;
                    MethodInfo page;
                    MethodInfo desc;
                    selObj = plugins[i];
                    Type t = selObj.GetType();
                    name = t.GetMethod("GetName");
                    version = t.GetMethod("GetVersion");
                    author = t.GetMethod("GetAuthor");
                    logo = t.GetMethod("GetImage");
                    page = t.GetMethod("GetPage");
                    desc = t.GetMethod("GetDescribe");
                    PlugInfo pi = new PlugInfo();
                    pi.Author = author.Invoke(selObj, null).ToString();
                    pi.PlugName = name.Invoke(selObj, null).ToString();
                    pi.Version = version.Invoke(selObj, null).ToString();
                    pi.PlugName = name.Invoke(selObj, null).ToString();
                    pi.Logo = logo.Invoke(selObj, null) as System.Windows.Media.Imaging.BitmapImage ;
                    pi.Page = page.Invoke(selObj, null) as UserControl;
                    pi.Describe = desc.Invoke(selObj, null).ToString();
                    plugList.Add(pi);
                }
                catch { }
            }
        }
    }

写一个manager 用来发现插件并添加都插件列表

其实这部分内容很简单,我们加载文件,通过反射来获取文件的相关信息:

  Assembly ab = Assembly.LoadFile(file);
                    Type[] types = ab.GetTypes();

我们可以看到这个

public ObservableCollection<PlugInfo> plugList = new ObservableCollection<PlugInfo>();

这个其实使用了mvvm里面的输入绑定的另外一部分,这样,数据源的任何变动都会被推送到view层进行同步。这就与上一篇的数据绑定联系上了。

活学活用,have fun。

么么么么哒

时间: 2024-09-29 09:10:45

C#博客随笔之七:反射初体验的相关文章

第一篇博客随笔

工作近一年,每天都有一个成为技术大牛的梦,可总是被各种琐事放下,来京一年多,计划三五年,已过近三分之一,可还是没有什么实质性的突破,仍然混在菜鸟的行列. 期望在预期完成前,可以达到自己的预期.距2018年结束,还剩下两个月时间,先给自己定下一个小目标. 1.每周至少保证1~2篇的博客随笔,不管好赖,有个记录,也方便自己日后在看. 2.坚持每天的英语.日语的学习,不要求过多,每天至少保证30分钟的外文阅读即可. 3.每周至少搞定一天文章.http://java-performance.info/

博客随笔《文章目录》大纲

/**博客随笔<文章目录>大纲***/ /---------更新时间:2018-9-30 ------------/ /* *大纲分为三大部分,包括:前端开发技术.服务器开发技术.数据库开发技术 */ /-------------------------------------------------- 前端技术 ------------------------------------------------------------/ 一.html/css/html5/css3 html+cs

第一次博客随笔 吴为橦

写博客随笔的意义,其实就和记录美好生活差不多,想到什么写什么.关于Python这是上了大学以来学到的第四种计算机语言了.对于一个还没将之前的东西学透的人来说可以说是相当难学了. 废话不说,首先要知道Python才能够对于之后的学习更有帮助.Python是一种计算机程序设计语言.是一种动态的.面向对象的脚本语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项目的开发.它的发展历程可以说是很短了,在20世纪90年代的时候才创建出来模板.

博客园美化博客随笔目录

博客园美化博客随笔目录 基于孤傲苍狼在2014-5-11写的目录代码基础上进行改进 一.js代码 <!--目录--> <script type="text/javascript"> var BlogDirectory = { /* 获取元素位置,距浏览器左边界的距离(left)和距浏览器上边界的距离(top) */ getElementPosition:function (ele) { var topPosition = 0; var leftPosition

Flutter 即学即用系列博客——04 Flutter UI 初窥

前面三篇可以算是一个小小的里程碑. 主要是介绍了 Flutter 环境的搭建.如何创建 Flutter 项目以及如何在旧有 Android 项目引入 Flutter. 这一篇我们来学习下 Flutter 的 UI. 前言 说到 UI,我就简单说下 Flutter 作为一门跨平台语言具有的优势之一,提高效率吧. 举个例子: 假设现在要开发一个界面,Android 开发需要一天,iOS 开发也需要一天.那么就是两天. 如果你用 Flutter 开发,就只需要一天(因为 Android 和 iOS 都

C#博客随笔之五:文件格式化输出

这篇博客主要是用到的知识点是将文件中的内容进行格式化输出 直接上图 左边是初始文件,右边是结果. 然后上程序界面 然后接下来上代码 private void button1_Click(object sender, EventArgs e) { //读取文件的对话框 OpenFileDialog fileDialog = new OpenFileDialog(); if (fileDialog.ShowDialog() == DialogResult.OK) { //如果点击确定的话,将文件完整

C#博客随笔之十:Problem Statement+System Glossary+System Supplementary Specification FOR每美欲下

似乎这是要求的最后一篇博客了,然而依然要好好写呢! MeiMeiYuXia Problem Statement Version 1.0 Revision History Date Issue Description Author 18/May/2015 1.0 Initial creation. Extracted the Problem Statement from the Vision document for purposes of scoping. Melody.Wang 24/May/

优秀博客随笔收录(持续更新...)

1 IT工具软件类 (1)最实用的IT类网站及工具大集合(PS:本文讲述了软件开发过程中大部分常用的工具及网站) (2)你必须收藏的Github技巧(PS:想学习在GitHub上搭建个人博客的同学可以看看) (3)Vmware Server 2.0.2 安装图文解说(比较详细)(PS:初步学习如何安装Linux虚拟机的同学可以看看) 待续...

新博客随笔

今天刚开通博客,先说说开通博客的原因.因为一个月前辞去毕业后的第一份工作,有很多时间去思考自己未来的职业规划,所以想通过博客记录一下.另外一个原因是几天前到ucloud面试,深受打击,意识到自己有太多的不足.为了在未来能够让自己变得更优秀,开始去写技术博客也是我要做的第一步. 对大学至今五年时间里的自己先做一个总结.普通得不能再普通的本科院校,自动化专业,四年大学生涯留下更多应该是遗憾.第一,毕业以后和在一起四年的女朋友分手,这让我有一段时间浑浑噩噩,脑子里总想着我要怎么努力工作证明自己,也只是