简单反射练习

主要是:

  • 利用反射对实例进行构造;
  • 以及调用实例的方法;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Security;
using System.Security.Permissions;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;

namespace AssemblyBuilder
{
    class Program
    {
        public static Assembly ReadAssembly(string assemblyPath)
        {
            return Assembly.LoadFrom(assemblyPath);
        }

        public static Assembly ReadAssembly(Stream stream)
        {
            SecurityPermission securityPermission = new SecurityPermission(SecurityPermissionFlag.ControlEvidence);
            securityPermission.Assert();
            int num = (int)stream.Length;
            byte[] array = new byte[num];
            stream.Read(array, 0, num);
            try
            {
                return Assembly.Load(array);
            }
            finally
            {
                CodeAccessPermission.RevertAssert();
            }
        }

        public static Stream ReadAssemblyToStream(string assemblyPath)
        {
            FileStream fileStream = new FileStream(assemblyPath, FileMode.Open, FileAccess.Read, FileShare.Read);
            try
            {
                int num = (int)fileStream.Length;
                byte[] array = new byte[num];
                fileStream.Read(array, 0, num);
                return new MemoryStream(array);
            }
            finally
            {
                fileStream.Close();
            }
        }

        static void Main(string[] args)
        {
            Stream assemblyStream = ReadAssemblyToStream("./Lambda_Test.exe");
            var assembly = ReadAssembly(assemblyStream);

            //使用 InvokeMember 调用构造函数初始化实例也可以
            var programInstance = assembly.CreateInstance("FactoryMode.Program");
            if (programInstance == null)
            {
                Console.WriteLine("There is no this type");
            }
            else
            {
                var myType = programInstance.GetType();
                Console.WriteLine("Type name is {0}", myType.ToString());

                MethodInfo[] methods = myType.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);
                Console.WriteLine("Method number:{0}", methods.Length);
                foreach(var method in methods)
                {
                    //怎样通过反射调用方法?
                    if(method.Name == "NotMainMethod")
                    {
                        Console.WriteLine("Find method, name:{0}", method.Name);

                        //没有实例直接用类型进行 InvokeMember 调用,需要调用类型的构造函数后再调用目标方法(前提示有定义构造函数),要带上 BindingFlags.CreateInstance
                        //myType.InvokeMember("NotMainMethod", BindingFlags.Public | BindingFlags.CreateInstance, null, null, null);

                        //使用已有实例时,就要指定 BindingFlags.Instance
                        myType.InvokeMember("NotMainMethod", BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod, null, programInstance, null);

                        //有实例则直接使用
                        method.Invoke(programInstance, null);
                    }
                }
            }

            Console.ReadKey();
        }
    }
}
时间: 2024-10-06 07:37:35

简单反射练习的相关文章

简单反射机制

1.什么是反射? MSND:反射提供了封装程序集.模块和类型的对象(Type 类型).可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性.如果代码中使用了属性,可以利用反射对它们进行访问. 反射的名称空间:System.Reflection,具体参考http://msdn.microsoft.com/zh-cn/library/system.reflection.aspx 小编理解:在做程序的时候,一般采取类的实例化,来操纵对象的行为.就是我

Java简单反射练习

昨晚看了Java的反射,附带做了下里面的反射练习, 案例:写一个“框架”,可以创建任意类的对象,并执行其中的任意方法: 前提:不能改变该类的任意代码,可以创建任意类的对象,可以执行任意方法 实现:1.配置文件+2.反射 步骤: (1)创建一个简单Person类 public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; thi

简单反射使用

引用一个匹配的类型 如没接口可以使用DAL相符合的类 用于接收返回实例 下面方法实现反射 public Idal ss() { Assembly ass = Assembly.Load("dal"); DAL类型 t = (DAL类型)ass.CreateInstance(assname + ".dal"); return t; } 然后在BLL里调用ss()方法 原文地址:https://www.cnblogs.com/wslpf/p/9388623.html

.net 简单反射应用

var attributes = typeof(MyClass).GetCustomAttributes(typeof(TestAttribute), true); //MyClass 表示引用特性的类 TestAttribute特性定义的类 foreach (var attribute in attributes) {     TestAttribute myAttribute = attribute as TestAttribute;      if (myAttribute != null

java简单反射调用get,set方法

public Object setDate(ResultSet rs,Object o) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IntrospectionException, IllegalArgumentException, InvocationTargetException, SQLException{ Class cs = Class.forName(o.getClass

C#之反射(PropertyInfo类)

1.引入命名空间:System.Reflection:程序集:mscorlib(在mscorlib.dll中) 2.示例代码(主要是getType().setValue().getValue()方法): 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Reflection; 5 using System.Text; 6 using System.Threading.Ta

浅析C#种的反射

1.前言 以前也写过几篇关于反射的博客(简单反射机制),但都理解的不是很深刻,现在在做项目中又一次的用到了反射,在此再总结一下,对于反射的理解. 2.什么是反射? 最近看博客,才理解了反射无处不在,我们经常用到的VS中的智能提示,就是通过反射获取到类的属性,方法等.反射就是动态获取程序集中的元数据来操作类型的.说的通俗一点,反射就是直接调用Bin文件夹下的.dll来创建对象,调用成员,摆脱了以前通过实例化也就是New操作的方法来调用对象的方法. 小结:反射就是直接调用.dll来创建对象,反射让创

【JAVA】反射总结

反射是什么? 反射就是指程序在运行的时候可以知道一个类的自身信息. 自身信息有哪些:类方法.属性.成员变量.构造方法.包等 动态编译和静态编译  静态编译:在编译的时候进确定类型,如果绑定对象成功,new 是静态加载类,就编译通过. ClassA classA = new ClassA(); 动态编译:在运行的时候确定类型,绑定对象.最大发挥了Java的多态,降低类之间的耦合性. Class c = Class.forName("ClassA"); ClassA classA = (C

2016-01-20_11S_08day

一.isinstance 判断对象是否为类的实例 n1 = 10 print isinstance(n1,int) class A: pass class B(A): pass b= B() print isinstance(b,B) print isinstance(b,A) =================== D:\python\python.exe D:/python_scripts/11S_08day/index.py True True True 注意:1.isinstance用于