C# 反射相关的东西

public class PlugingManager
    {
        //插件装载器
        public ArrayList Plugins = new ArrayList();
        //插件FullName
        public ArrayList PlugFullName = new ArrayList();
        //插件类型
        public ArrayList PlugTypes = new ArrayList();

#region 构造函数
        /// <summary>
        /// PlugingManager插件加载
        /// </summary>
        /// <param name="plugspath">插件所在目录必须是运行目录中的文件夹</param>
        /// <param name="StartsWith">加载指定插件(插件包含的名称)</param>
        /// <param name="InterfaceName">插件接口名称</param>
        public PlugingManager(string plugspath,string StartsWith,string InterfaceName)
        {
            //获取插件目录(plugins)下所有文件
            string[] files = Directory.GetFiles(Application.StartupPath + @"\\" + plugspath);
           
            foreach (string file in files)
            {
                if (file.ToUpper().EndsWith(StartsWith.ToUpper()))
                {
                    try
                    {
                        //Assembly ab = Assembly.LoadFrom(file);
                        Assembly ab = null;

//先将插件拷贝到内存缓冲
                        byte[] addinStream = null;
                        using(FileStream input = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read))
                        {
                            BinaryReader reader = new BinaryReader(input);
                            addinStream = reader.ReadBytes((int) input.Length);

}
                        ab = Assembly.Load(addinStream); //加载内存中的Dll
                        Type[] types = ab.GetTypes();
                        foreach (Type t in types)
                        {
                            if (t.GetInterface(InterfaceName) != null)
                            {
                                Plugins.Add(ab.CreateInstance(t.FullName));
                                PlugFullName.Add(t.FullName);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
            }
        }
        #endregion
    }

PlugingManager plug = new PlugingManager("Plugs", "Garden.Plugs.dll", "IPlug");

var win = plug.Plugins.ToArray().FirstOrDefault(m => ((Type)m.GetType()).Name.ToLower() == this.Tag.ToString().ToLower());
            MethodInfo OnShowDlg = ((Type)win.GetType()).GetMethod("ShowSelf");
            Form cl = (Form)OnShowDlg.Invoke(win, null);
            cl.WindowState = FormWindowState.Maximized;
            cl.MdiParent = this;
            cl.Show();
            foreach (object obj in plug.Plugins)
            {

Type t = obj.GetType();
                MethodInfo OnShowDlg = t.GetMethod("ShowSelf");
                Control cl = (Control)OnShowDlg.Invoke(obj, null);

Control con = GetControlFromForm(t.Name, this);
                if (con != null)
                {
                    con.Controls.Add(cl);
                    cl.Dock = DockStyle.Fill;
                    isbreak = false;
                    con = null;
                }

}

上面是从内存中生成对象

//获取程序集 
            Assembly assembly = Assembly.Load("环环环环环");
            Assembly assembly2 = Assembly.LoadFrom("环环环环环.dll");

//从程序集中获取指定对象类型;
            Type type = assembly.GetType("环环环环环.User");

//使用Activator创建实例(无参数构造函数)
            var user1 = Activator.CreateInstance(type);
            //使用Activator创建实例(带参数构造函数)
            var user2 = Activator.CreateInstance(type, "薄暮");

//使用Assembly创建实例(无参数构造函数)
            var user3 = assembly.CreateInstance("环环环环环.User");

//反射无参构造函数
            ConstructorInfo constructor1 = type.GetConstructor(new Type[] {});
            var user4 = constructor1.Invoke(new object[] { });

//反射有参构造函数 
            ConstructorInfo constructor2 = type.GetConstructor(new Type[] { typeof(string) });
            var user5 = constructor2.Invoke(new object[] { "薄暮" });

//调用public函数(无参数)
            type.InvokeMember("PublicShow",
                              BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, user1,
                              null);

//调用public函数(带参数)
            string returnValue =
                type.InvokeMember("GetString",
                                  BindingFlags.InvokeMethod | BindingFlags.OptionalParamBinding, null, user1,
                                  new object[] { "薄暮" }) as string;

// 调用静态方法       
            string returnValue2 =
                type.InvokeMember("StaticMethod", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static,
                                  null, null, new object[] {}) as string;

// 调用私有方法 .       
            type.InvokeMember("PrivateShow",
                              BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, user1,
                              new object[] {});

//反射属性
            var Name =
                type.InvokeMember("Name", BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance, null,
                                  user1, new object[] {}) as string;

//设置属性(设置Name属性为"新属性")
            type.InvokeMember("Name", BindingFlags.SetProperty | BindingFlags.Public | BindingFlags.Instance, null,
                                  user1, new object[] {"新属性"});

//反射字段
            string Field =
                type.InvokeMember("Field", BindingFlags.GetField | BindingFlags.Public | BindingFlags.Instance, null,
                                  user1, new object[] {}) as string;

//设置字段(设置Field字段为"新字段")
            type.InvokeMember("Field", BindingFlags.SetField | BindingFlags.Public | BindingFlags.Instance, null,
                                  user1, new object[] { "新字段" });

这是标准的用法,还挺好玩的吧

时间: 2024-11-12 18:34:33

C# 反射相关的东西的相关文章

android一些系统相关的东西

增加快捷方式和删除快捷方式: private void addShortcut() { Intent shortcut = new Intent( "com.android.launcher.action.INSTALL_SHORTCUT"); // 快捷方式的名称 shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name)); shortcut.putExtra("duplicate&

整理的反射相关的文章

整理的反射相关的文章: (1).通俗理解反射(知乎):学习java应该如何理解反射? (2).关于反射比较深入的博文地址:深入解析Java反射(1) - 基础 原文地址:https://www.cnblogs.com/liran123/p/9971704.html

反射相关类

## 反射相关类 1. Class:类的模板,可以根据Class获取目标类的所有信息. 2. Field:字段/属性. 3. Constructor:构造函数. 4. Method:类中的方法. ## 获取Class的方式 1. 动态加载 ``` Class clz = Class.forName("com.demo.bean.User") ``` 2. 通过对象获取 ``` User zs = new User(); Class clz = zs.getClass(); ``` 3.

.Net实战之反射相关类之间的人体经络关系

--1.类的部分组成成员 --2.巧记成员之间的关系 [MyTableAttribute("T_UserInfo")] public class UserInfo : Person, UserService { private int _age2; private int _age; [DisplayName("年龄")] public int Age { get { return _age; } set { _age = value; } } [DisplayNa

Java 反射相关整理

1. Class 类 Class 是一个类,封装了当前对象所对应的类的信息,一个类中有属性,方法,构造器等. 对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象.一个 Class 对象包含了特定某个类的有关信息. Class 对象只能由系统建立对象,一个类(而不是一个对象)在 Java 虚拟机中只会有一个 Class 实例. Class 对象的由来是将 class 文件读入内存,并为之创建一个 Class 对象. 获取 Class 类对象的三种方法 使用 Class.forNa

[C#]反射相关

//Type type = DataHelper.Instance.GetType(); //MethodInfo[] infos = type.GetMethods(BindingFlags.Instance | BindingFlags.Public); Assembly ass = System.Reflection.Assembly.LoadFrom(@"D:\DBHelper.dll"); //Type type = ass.GetType("DBHelper.Sq

spring MVC学习(二)---配置相关的东西

1.在上一节中我们提到过每一个DispatcherServlet都会有一个上下文 (WebApplictionContext),并且继承了这些上下文中的bean,其中以一些"特殊"的我们会用到,但是一般我们可以不用去理会这些,也不用自己去维护,因为springMVC有一个默认的列表,它帮我们进行维护. 下面看下官方文档中列出的: 2.在1中我们提到默认维护的列表,这些都定义在DispatcherServlet.properties和DispatcherServlet在同一个包中,他们都

Java反射相关-通过class得到一个类的全部架构

package com.huawei.pia; import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Modifier; public class Person extends SuperClass1 implements Inter1,Inter2 { private String name; private int age;  public Person(Str

缓存相关的东西

再显示的开发中: 如果之后一台缓存服务器,所以的key 和 value 都往一台机器进行set 和get 如果有多台缓存服务器呢:如何自定一个合理的分配策略呢: http://blog.jobbole.com/90593/?utm_source=blog.jobbole.com&utm_medium=relatedPosts 关于缓存:需要考虑的问题还有很多,我这里先做一个to do..