C# 反射

C# 高级--反射 详解 C#来自于System.Reflection,是一个帮助类库,可以读取dll/exe中metadata,使用metadata创建对象。获取方法MethodInfo,执行MethodInfo 的Invoke方法,传递方法所在的类的实例对象+参数。需要传递一个object类型的数组作为参数,参数按照从昨往右严格匹配,如果没有匹配的报异常。中间语言,编译把高级语言编译后得到的C#中最真实的语言状态,面向对象语言。需要通过方法参数类型类区别方法,传递参数,严格匹配参数类型。一种反射技术,可以动态创建dll/exe。 阅读详情

什么是反射

在这里插入图片描述

IL: 也是一种面向对象语言,但是不太好阅读
metadata元数据:数据清单,描述了DLL/exe里面的各种信息
反射Reflection:System.Reflection,是.Net Framework提供的一个帮助类库 ,可以读取并使用metadata

反射的几种功能及实现

动态加载程序并创建对象

namespace Reflection.DB.MySql
{
    public class MySqlHelper : IDBHelper
    {
        public MySqlHelper()
        {
            //GetType获取当前实例的 Type。
            //Name获取当前成员的名称。
            Console.WriteLine($"{this.GetType().Name}被构造");
        }
        public void Query()
        {
            Console.WriteLine($"{this.GetType().Name}.query");
        }
    }
}

  #region 动态加载程序并创建对象
                {
                    //动态加载 一个完整的dll名称不需要后缀,从exe所在的路径进行查找
                    Assembly assembly = Assembly.Load("Reflection.DB.MySql");
                    //完整路径(全路径+文件后缀)
                    Assembly assembly1 = Assembly.LoadFile(@"C:\Users\Lenovo\Source\Repos\Csharp高级编程\MyReflectionProject\bin\Debug\netcoreapp3.1\Reflection.DB.MySql.dll");
                    //当前路径 (默认在当前路径查找 Dll全名称+后缀)
                    Assembly assembly2 = Assembly.LoadFrom("Reflection.DB.MySql.dll");
                    //路径同assembly1
                    Assembly assembly3 = Assembly.LoadFile(@"C:\Users\Lenovo\Source\Repos\Csharp高级编程\MyReflectionProject\bin\Debug\netcoreapp3.1\Reflection.DB.MySql.dll");

                    foreach (var type in assembly.GetTypes())
                    {
                        Console.WriteLine(type.Name);
                    }

                }
                {
                    //1. 动态加载 一个完整的dll名称不需要后缀,从exe所在的路径进行查找
                    Assembly assembly = Assembly.Load("Reflection.DB.SqlServer");
                    //2. 获取程序集中指定的类型,路径是全名称(命名空间+类名)
                    Type type = assembly.GetType("Reflection.DB.SqlServer.SqlServerHelper");
                    //3. 根据类型创建对象
                    object objSqlServer = Activator.CreateInstance(type);
                    //dynamic dSqlhelper = Activator.CreateInstance(type);  //动态类型不安全
                    // dSqlhelper.Query();
                    //dSqlhelper.show();  不安全,避开编译器的检查 

                    //4. 类型转换
                    IDBHelper dBHelper = objSqlServer as IDBHelper;
                    //5. 调用方法
                    dBHelper.Query();

                }
                //工厂方法进行包装
                {
                    IDBHelper dBHelper = SimpleFactory.CreateInstace();
                }
                #endregion




    public class SimpleFactory
    {
        private static string IDBHelperConfig="Reflection.DB.SqlServer";
        private static string DllName = "Reflection.DB.SqlServer";
        private static string TypeName = "Reflection.DB.SqlServer.SqlServerHelper";

        public static IDBHelper CreateInstace()
        {
            //1. 动态加载 一个完整的dll名称不需要后缀,从exe所在的路径进行查找
            Assembly assembly = Assembly.Load(DllName);
            //2. 获取程序集中指定的类型,路径是全名称(命名空间+类名)
            Type type = assembly.GetType(TypeName);
            //3. 根据类型创建对象
            object objSqlServer = Activator.CreateInstance(type);
            //dynamic dSqlhelper = Activator.CreateInstance(type);  //动态类型不安全
            // dSqlhelper.Query();
            //dSqlhelper.show();  不安全,避开编译器的检查 

            //4. 类型转换
            IDBHelper dBHelper = objSqlServer as IDBHelper;
            //5. 调用方法
            return dBHelper;
        }
    }

反射破坏单例 调用私有构造函数

  /// <summary>
    /// 单例模式:类,能保证在整个进程中只有一个实例
    /// </summary>
    public  sealed class Singleton
    {
        private static Singleton _Singleton = null;
        private Singleton()
        {
            Console.WriteLine("Singleton被构造");
        }
        static Singleton()
        {
            _Singleton = new Singleton();
        }
        public static Singleton GetInstance()
        {
            return _Singleton;
        }
    }
Singleton singleton = Singleton.GetInstance();
Singleton singleton1 = Singleton.GetInstance();
Singleton singleton2 = Singleton.GetInstance();
Console.WriteLine(object.ReferenceEquals(singleton, singleton1));  //返回true,表示是为单例 

Assembly assembly = Assembly.Load("Reflection.DB.SqlServer");
Type type = assembly.GetType("Reflection.DB.SqlServer.Singleton");
Singleton oSingleto = (Singleton)Activator.CreateInstance(type, true);  //第二个参数为true可以访问私有的方法
Singleton oSingleto1 = (Singleton)Activator.CreateInstance(type, true);
Console.WriteLine(object.ReferenceEquals(oSingleto, oSingleto1));  //返回false

反射调用方法

Assembly assembly = Assembly.Load("Reflection.DB.SqlServer");
Type type = assembly.GetType("Reflection.DB.SqlServer.ReflectionTest");
object oReflectionTest = Activator.CreateInstance(type, true); //创建对象

// public void Show1()  无参
MethodInfo methodShow1 = type.GetMethod("Show1");
methodShow1.Invoke(oReflectionTest, new object[] { });

//  public void Show2(int id)  有参
MethodInfo methodShow2 = type.GetMethod("Show2");
methodShow2.Invoke(oReflectionTest, new object[] { 123 });

//public void Show3(int id,string name)  重载
MethodInfo methodShow3 = type.GetMethod("Show3", new Type[] { typeof(int), typeof(string) });
methodShow3.Invoke(oReflectionTest, new object[] { 123, "zhangsan" });


//  public void Show3(string name, int id)  重载
MethodInfo methodShow3_2 = type.GetMethod("Show3", new Type[] { typeof(string), typeof(int) });
methodShow3_2.Invoke(oReflectionTest, new object[] { "wangwu", 123 });


//private void Show4(string name)  私有方法
MethodInfo methodShow4 = type.GetMethod("Show4", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
methodShow4.Invoke(oReflectionTest, new object[] { "wangwu" });

// public static void Show5(string name) 静态方法
MethodInfo methodShow5 = type.GetMethod("Show5");
methodShow5.Invoke(oReflectionTest, new object[] { "wangwu" });
methodShow5.Invoke(null, new object[] { "wangwu" });

ReflectionTest

namespace Reflection.DB.SqlServer
{
    /// <summary>
    /// 反射测试类
    /// </summary>
    public class ReflectionTest
    {
        #region Identity
        /// <summary>
        /// 无参数构造函数
        /// </summary>
        public ReflectionTest()
        {
            Console.WriteLine($"这里是{this.GetType()}无参数构造函数");
        }
        /// <summary>
        /// 有参数构造函数
        /// </summary>
        /// <param name="name"></param>
        public ReflectionTest(string name)
        {
            Console.WriteLine($"这里是{this.GetType()}有参数构造函数");
        }
        /// <summary>
        /// 有参数构造函数
        /// </summary>
        /// <param name="id"></param>
        public ReflectionTest(int id)
        {
            Console.WriteLine($"这里是{this.GetType()}有参数构造函数");
        }
        /// <summary>
        /// 多参数构造函数
        /// </summary>
        /// <param name="id"></param>
        /// <param name="name"></param>
        public ReflectionTest(int id,string name)
        {
            Console.WriteLine($"这里是{this.GetType()}有参数构造函数");
        }
        #endregion

        #region Method
        /// <summary>
        /// 无参数方法
        /// </summary>
        public void Show1()
        {
            Console.WriteLine($"这里是{this.GetType()}的show1");
        }
        /// <summary>
        /// 有参数方法
        /// </summary>
        /// <param name="id"></param>
        public void Show2(int id)
        {
            Console.WriteLine($"这里是{this.GetType()}的show2");
        }


        #region show3  重载
        /// <summary>
        /// 重载方法之一
        /// </summary>
        /// <param name="id"></param>
        /// <param name="name"></param>
        public void Show3(int id,string name)
        {
            Console.WriteLine($"这里是{this.GetType()}的show3");
        }
        /// <summary>
        /// 重载方法之二
        /// </summary>
        /// <param name="id"></param>
        /// <param name="name"></param>
        public void Show3(string name,int id)
        {
            Console.WriteLine($"这里是{this.GetType()}的show3_2");
        }
        /// <summary>
        /// 重载方法之三
        /// </summary>
        /// <param name="name"></param>
        /// <param name="id"></param>
        public void Show3( int id)
        {
            Console.WriteLine($"这里是{this.GetType()}的show3_3");
        }
        /// <summary>
        /// 重载方法之四
        /// </summary>
        /// <param name="name"></param>
        public void Show3(string name)
        {
            Console.WriteLine($"这里是{this.GetType()}的show3_4");
        }
        // 重载方法之五
        public void Show3()
        {
            Console.WriteLine($"这里是{this.GetType()}的show3_1");
        }
        #endregion


        /// <summary>
        /// 私有方法
        /// </summary>
        /// <param name="name"></param>
        private void Show4(string name)
        {
            Console.WriteLine($"这里是{this.GetType()}的Show4");
        }
        /// <summary>
        /// 静态方法
        /// </summary>
        /// <param name="name"></param>
        public static void Show5(string name)
        {
            Console.WriteLine($"这里是{typeof(ReflectionTest)}的Show5");
        }
        #endregion
    }
}

反射获取泛型方法

//普通类有泛型方法
Assembly assembly = Assembly.Load("Reflection.DB.SqlServer");


//普通类有泛型方法
{
    Type type = assembly.GetType("Reflection.DB.SqlServer.GenericMethod");
    object oReflectionTest = Activator.CreateInstance(type); //创建对象
    MethodInfo method = type.GetMethod("Show");
    //用类型数组的元素替代当前泛型方法定义的类型参数
    MethodInfo show = method.MakeGenericMethod(new Type[] { typeof(int), typeof(string), typeof(DateTime) });
    show.Invoke(oReflectionTest, new object[] { 123, "zhang", DateTime.Now });
}
//泛型类有泛型方法
{
    Type type = assembly.GetType("Reflection.DB.SqlServer.GenericClass`3");  //`3 表示泛型个数

    //指定创建对象需要的泛型参数
    Type GenericType = type.MakeGenericType(new Type[] { typeof(int), typeof(string), typeof(DateTime) });
    //创建对象
    object oReflectionTest = Activator.CreateInstance(GenericType);
    //因为方法的泛型参数在获取类型时已经获取,所以不需要再指定
    MethodInfo method = GenericType.GetMethod("Show");
    //用类型数组的元素替代当前泛型方法定义的类型参数
    method.Invoke(oReflectionTest, new object[] { 123, "zhang", DateTime.Now });
}

//泛型类有泛型方法,并且方法中有使用到类所定义的泛型类型
{
    Type type = assembly.GetType("Reflection.DB.SqlServer.GenericDouble`1"); //`1 表示泛型个数
    //指定创建对象需要的泛型参数
    Type GenericType = type.MakeGenericType(new Type[] { typeof(bool)});
    //创建对象
    object oReflectionTest = Activator.CreateInstance(GenericType);
                       
    MethodInfo method = GenericType.GetMethod("Show");
    //获取方法的泛型参数类型
    MethodInfo show = method.MakeGenericMethod(new Type[] { typeof(string), typeof(DateTime) });
    show.Invoke(oReflectionTest, new object[] { true, "zhang", DateTime.Now });
}
namespace Reflection.DB.SqlServer
{
    /// <summary>
    /// 泛型类有泛型方法
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <typeparam name="W"></typeparam>
    /// <typeparam name="X"></typeparam>
    public class GenericClass<T, W, X>
    {
        public void Show(T t,W w,X x)
        {
            Console.WriteLine($"t.type={t.GetType().Name},w.type={w.GetType().Name},x.type{x.GetType().Name}");
        }
    }
    /// <summary>
    /// 普通类有泛型方法
    /// </summary>
    public class GenericMethod
    {
        public void Show<T, W, X>(T t, W w, X x)
        {
            Console.WriteLine($"t.type={t.GetType().Name},w.type={w.GetType().Name},x.type{x.GetType().Name}");
        }
    }
    /// <summary>
    /// 泛型类有泛型方法,并且方法中有使用到类所定义的泛型类型
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class GenericDouble<T>
    {
        public void Show<W, X>(T t, W w, X x)
        {
            Console.WriteLine($"t.type={t.GetType().Name},w.type={w.GetType().Name},x.type{x.GetType().Name}");
        }
    }
}

反射获取属性与字段

//反射获取属性与字段
{
    People people = new People
    {
        Id = 123,
        Name = "zH",
        Description = "dy"
    };
    Console.WriteLine($"id={people.Id},name={people.Name},description={people.Description}");
    Type type = typeof(People);
    object oPeople=Activator.CreateInstance(type);
    //设置属性值
    foreach (PropertyInfo prop in type.GetProperties())
    {
        if (prop.Name.Equals("Id"))
        {
            prop.SetValue(oPeople, 456);
        }
        else if (prop.Name.Equals("Name"))
        {
            prop.SetValue(oPeople, "hu");
        }
        Console.WriteLine(prop.GetValue(oPeople));
    }
    //设置字段
    foreach (FieldInfo field in type.GetFields())
    {
        if (field.Name.Equals("Description"))
        {
            field.SetValue(oPeople, "描述信息");
        }
    }
    //获取属性
    foreach (PropertyInfo prop in type.GetProperties())
    {
        Console.WriteLine($"oPeople.{prop.Name}={prop.GetValue(oPeople)}");
    }
    //获取字段
    foreach (FieldInfo field in type.GetFields())
    {
        Console.WriteLine($"oPeople.{field.Name}={field.GetValue(oPeople)}");
    }
}
namespace Reflection.Model
{
    public class People
    {
        public People()
        {
            Console.WriteLine($"{this.GetType().FullName}被创建");
        }
        public int Id { get; set; }
        public string Name { get; set; }
        public string Description;
    }
}
C#反射 优点: 1. 提高程序的灵活性与可扩展性,耦合度; 缺点: 1. 过多使用,会造成逻辑模糊,因为反射已经绕过的源码,看不到逻辑实现,会造成后期维护上的困扰 2. 性能的问题,使用反射处在解释的操作,主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用 小结:.Net应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(... 阅读详情

相关推荐

C#的反射

一、反射介绍 反射:指程序可以访问、检测和修改它本身状态或行为的一种能力(即:审查元数据并收集关于它的类型信息的能力) ①元数据(编译以后的最基本数据单元)可以理解为一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等。 ②反射则提供了封装程序集、模块和类型的对象(程序集包含模块,而模块包含类型,类型又包含成员【成员--->类型--->模块--->程序集】)。 ③可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象..

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1万+

c#之反射详解

C#之反射详解

鲤籽鲲的博客 2万+

SCDM学习笔记(5)

几何前处理后一般会获得几何的固体区域,然而当进行流体仿真的时候是对流体的区域进行计算的。因此,如何快速地从固体的几何模型获得流体的几何模型是一个重点问题。 流体问题一般可分为内流场与外流场问题,对于内流场问题,SCDM有专门的处理工具 工程图纸大致如下: 要创建这个几何的大致策略是画出截面的圆形,再画出轴线,通过扫掠的方式建立几何。 以上是mixing的国体区域,通过体积抽...

diyhoo的编程小屋 6358

C#中的反射

一:什么是反射 通俗来讲,反射就是我们在只知道一个对象的外部而不了解内部结构的情况下,通过反射可以使我们明确这个对象的内部实现 反射是.Net中获取运行时类型信息的一种方式,.Net应用程序由几个部分组成:程序集(Assembly)、模块(Module)、类型(Class)。而反射提供一种编程的方式,可以在程序运行期获得这几个组成部分的相关信息 二:反射的作用 利用反射可以在不需要使用new关键词的情况下,就可以动态创建对象,使用对象 三:反射是如何实现的 反射的内部实现依赖于元数据 元数据简单来

L的博客 1万+

沧小海深入剖析xilinx的GTP/GTX核,掌握高速串行收发机制——第六章 接收端结构及功能说明

总目录在这哦~ https://blog.youkuaiyun.com/z123canghai/article/details/107700878 第六章 接收端结构及功能说明 子目录 6.1 RX的模拟前端 6.2 RX的OOB信号 6.3 RX的均衡器 6.4 RX的CDR 时钟数据恢复 6.5 RX时钟输出结构 6.6 RX 的极性控制 6.7 RX 的PRBS 6.8 Rx字节、字的对齐功能 6.9 Rx接收弹性缓冲区 6.10 Rx的时钟纠正 6.11 Rx接收通道绑定 6...

滄海的博客 1万+

从仿真到打样:PMOS栅极泄放电路设计全流程复盘与三个踩坑点总结

本文详细复盘了PMOS栅极泄放电路从仿真到打样的全流程设计,重点总结了三个关键踩坑点:三极管BE结过压击穿、静态功耗超标和栅极振荡现象。通过优化缓启动电路、改进保护设计和布局调整,最终实现18ms开通时间、190μs关断时间和8μA静态功耗的工业级性能指标,为类似电源开关设计提供实用参考。

weixin_28693683的博客 371

C#反射详解

目录 反射定义反射(C# 编程指南) 使用场景 形象说明 反射的用途 反射用到的主要类 System.Type类用法 实例应用 System.Reflection.Assembly类的用法 反射定义反射(C# 编程指南)   反射提供了封装程序集、模块和类型的对象(Type类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了特性,可以利用反射对它们进行访问。 使用场景 需要访问程序元数据的特性。 检查..

潘达小新 5776

别再死记硬背了!用Amesim HCD库亲手搭建单向阀、锥阀、球阀模型(附详细参数设置)

本文详细介绍了如何使用Amesim HCD库从零构建单向阀、锥阀和球阀的仿真模型,帮助工程师摆脱死记硬背,掌握物理建模的核心技巧。通过实战案例和参数设置指南,读者将学会如何优化阀门动态响应、验证流量特性以及处理旋转运动等独特挑战,提升液压系统设计效率。

weixin_29248611的博客 501

【C#进阶】C# 反射

关于编程语言 C# 反射的介绍。

好学若饥,谦卑若愚。 3112

逆变器LCL滤波器参数设计(一)

1.基本介绍 并网型逆变器一般是电流源逆变器,滤波器基本用LCL结构。 假设要设计额定功率10KVA的单相逆变器,采用两电平的全桥拓扑,采用SPWM控制,载波频率20KHz,电网等级220V,频率50Hz。 拓扑结构如图所示: 直流输入电压分为上下母线各1/2Vin,半母线电压为380V。 L1采用高频磁芯绕制,称为高频电感;L2用工频电感绕制,称工频电感;C是滤波电容,为高频谐波电流提供通路;Vg为电网电压。 载波调制比为:Mr=220*1.414/380=0.819 2.高频电感量的计算 逆变器可以等

weixin_43549807的博客 5万+

机器视觉检测到底怎么做,经验分享

笔者做机器视觉检测已经有五六年了,也算是对机器视觉的检测技术有了一定的掌握。总的来说,基于机器视觉的检测技术主要包含三个部分:视觉采集模块、后台分析模块和动作决策模块。这几个分类,跟教科书上的有较大差异,很多同学觉得我在杜撰。笔者也不作反驳,因为这是笔者这些年工作经验的总结,自然区别于教科书。下面我们分开来讲这几个模块,同时会把笔者之前的论文做个推荐总结。 所有文章均可在博主的主页中找到,若无法找到,可以用搜索工具。博主的主页: https://blog.youkuaiyun.com/Aoulun 第..

Aoulun的博客 8677

C#之反射

动态创建类型实例调用类型的方法访问类型的字段和属性检查类型的元数据(如基类、接口、特性等)运行时类型检查和操作能力动态代码执行的基础框架和库开发的关键技术它可能破坏封装性性能开销较大代码可读性可能降低最佳实践在需要高度灵活性的场景使用(如插件系统、序列化)缓存反射结果以提高性能考虑使用动态类型或源代码生成作为替代方案始终处理可能的反射异常通过合理使用反射,你可以构建出更加灵活和可扩展的C#应用程序。

Major_S的博客 1527

Ubuntu20.04 安装 MATLAB R2023b 常见问题及解决方案

本文提供了Ubuntu20.04系统上安装MATLAB R2023b的完整指南,包括系统要求检查、依赖项安装、详细安装步骤及常见问题解决方案。特别针对GTK模块加载失败、OpenGL图形加速问题和中文显示乱码等常见问题提供了有效解决方法,帮助用户顺利完成安装并优化使用体验。

weixin_42619061的博客 483

详谈C#反射及应用

反射 什么是元数据?什么是反射? 程序数用来处理数据的,文本和特性都是数据,而程序本身(类的定义和BLC中的类)这些也是数据。 有关程序及其类型的数据被称为元数据,他们保存在程序集中。 程序在运行时,可以查看其他程序集或其本身元数据。一个运行的程序查看本身的元数据或其他程序集的元数据的行为称为反射。 Type 使用 Type 类进行反射,使用特性给类型添加元数据 对于程序中用到的每个类型,CLR 都会创建一个包含这个类型信息的 Type 对象。 程序中每用到一个类型都会关联到独立的 Type 类的对象

菜鸟厚非 2万+

把时间当成数据:SAP ABAP 里的 DATS/TIMS 与 DATN/TIMN,怎么选才不踩坑

SAP项目中日期时间字段的陷阱与优化 日期时间字段(DATS/TIMS)在SAP项目中看似简单却常引发事故,主要问题包括: 非法日期(如20201331)入库后,在月结、对账时爆发异常 空值被处理为00000000导致排序错误 ABAP提供两种处理方案: 经典类型DATS/TIMS:存储为字符格式,校验宽松易存脏数据 HANA原生类型DATN/TIMN:数据库级校验,写入即拦截非法值 优化建议: 在接口层和入库前进行严格校验 新项目优先使用DATN/TIMN类型 对遗留数据使用DATS_IS_VALID等函

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 184

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C#反射实例

C#反射的入门学习首先要明白C#反射提供了封装程序集、模块和类型的对象等等。那么这样可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性...

zls365365的博客 1037

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

JAVA反射与C#反射之比较

<br />  JAVA反射与C#反射之比较一.什么是反射<br />      在运行时环境,能否根据一个类的名字,来得到这个类的属性和方法?对于任何一个运行时的对象能否动态调用这个对象的方法?答案是可以的。这种动态的获取类的信息以及动态调用一个对象的方法的机制叫做反射。<br />      反射提供的主要功能:<br />      1.在运行时判断任意一个对象所属的类<br />      2.在运行时构造一个类的对象<br />      3.在运行时判断一个类所具有的属性和方法<br />   

xswwlpz的专栏 1339

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Reflection反射【C#】

【代码】反射Reflection。

cfqq1989的博客 2448

C#中的反射使用

在C#中,反射(Reflection)是一种强大的机制,它允许我们在运行时检查和操作程序集、类型、成员以及调用方法。通过反射,我们可以动态地获取和操作代码的元数据,而不需要在编译时固定类型。反射是C#中非常强大且灵活的功能,它使我们能够在运行时动态地获取和操作类型的信息。通过反射,我们可以实现许多高级功能,从而使应用程序更具灵活性和扩展性。然而,反射在性能方面可能会有一些开销,因此在使用反射时需要谨慎考虑性能问题,并进行必要的优化。

故事不长丨的博客 2023
上一篇: 计算机存储与进制转换
下一篇: 工业互联网个人想法
WorldCode
博客等级 码龄8年 2粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值