A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李朋霏 中级黑马   /  2012-7-16 19:12  /  1353 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

经常提到反射,好像和Type类型有关?怎么应用的呢?

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

3 个回复

倒序浏览
用途:
①使用Assembly定义和加载程序集,加载在程序集清单中列出模块,
以及从此程序集中查找类型并创建该类型的实例。
  ②使用Module了解包含模块的程序集以及模块中的类等,
还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。
  ③使用ConstructorInfo了解构造函数的名称、参数、访问修饰符(
如pulic 或private)和实现详细信息(如abstract或virtual)等。使用Type的
GetConstructors或GetConstructor方法来调用特定的构造函数。
  ④使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符(如pulic 或private)
和实现详细信息(如abstract或virtual)等。使用Type的GetMethods或GetMethod方法来调用特定的方法。
  ⑤使用FiedInfo了解字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等,
并获取或设置字段值。
  ⑥使用EventInfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,
添加或移除事件处理程序。
  ⑦使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,
获取或设置属性值。
  ⑧使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,
以及参数在方法签名中的位置等。
示例代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace myReflection
{
    class Program
    {
        static void Main(string[] args)
        {
            Master ma = new Master();
            Type tp = ma.GetType();
            MethodInfo [] MI = tp.GetMethods();
            foreach (MethodInfo mm in MI)
            {
                Console.WriteLine(mm.Name);
            }
        }
    }


    class Student
    {
        private string stuName;

        public string StuName
        {
            get { return stuName; }
            set { stuName = value; }
        }
        private int stuAge;

        public int StuAge
        {
            get { return stuAge; }
            set { stuAge = value; }
        }
        public void study()
        {
            Console.WriteLine("学习!");
        }
    }

    class Master:Student
    {
        public void Say()
        {
            Console.WriteLine("硕士.....");
        }
    }
}

  输出的结果为:Say,get_StuName,set_StuName,get_StuAge,set_StuAge,study  
            //这里是我自己写的方法和属性系统把属性也当做方法输出了

  GetType,ToString,Equals,GetHashCode   //这里是继承的 Object的方法。
希望对楼主有帮助。

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
反射提供了封装程序集、模块和类型的对象(Type 类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,可以利用反射对它们进行访问。
使用静态方法 GetType-- 从 Object 基类派生的所有类型都继承该方法 -- 获取变量类型的简单反射示例:
// Using GetType to obtain type information:
int i = 42;
System.Type type = i.GetType();
System.Console.WriteLine(type);
输出为:
System.Int32
此示例使用反射获取已加载的程序集的完整名称:
// Using Reflection to get information from an Assembly:
System.Reflection.Assembly o = System.Reflection.Assembly.Load("mscorlib.dll");
System.Console.WriteLine(o.GetName());
输出为:
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
反射在下列情况下很有用:
需要访问程序元数据的属性。请参见主题使用反射访问属性。
检查和实例化程序集中的类型。
在运行时构建新类型。使用 System.Reflection.Emit 中的类。
执行后期绑定,访问在运行时创建的类型的方法。

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
反射提供了封装程序集、模块和类型的对象(Type 类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,可以利用反射对它们进行访问。
反射在下列情况下很有用:

需要访问程序元数据的属性。请参见主题使用反射访问属性。

检查和实例化程序集中的类型。

在运行时构建新类型。使用 System.Reflection.Emit 中的类。

执行后期绑定,访问在运行时创建的类型的方法。请参见主题动态加载和使用类型。
提升反射性能的方法
反射的性能损失主要来源于比较类型、遍历成员、调用成员三种情形,其中比较类型耗时最小,调用成员耗时最多,所以尽量减少采用成员动态调用等反射方式可以提高应用程序性能。除此之外,采取后期绑定、避免将反射方法放到循环内产生放大效应等办法均可提升反射性能。

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马