C#反射机制(转)

一:反射的定义

  审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等。

  System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码

  System.Reflection.Assembly 
  System.Reflection.MemberInfo
  System.Reflection.EventInfo
  System.Reflection.FieldInfo
  System.Reflection.MethodBase
  System.Reflection.ConstructorInfo
  System.Reflection.MethodInfo
  System.Reflection.PropertyInfo
  System.Type

  层次模型:

  

二:获取类型信息: 

 1         class MyClass
 2         {
 3             public string m;
 4             public void test() { }
 5             public int MyProperty { get; set; }
 6         }
 7
 8         //获取类型信息
 9         protected void Button1_Click(object sender, EventArgs e)
10         {
11             Type type = typeof(MyClass);
12             Response.Write("类型名:" + type.Name);
13             Response.Write("<br/>");
14             Response.Write("类全名:" + type.FullName);
15             Response.Write("<br/>");
16             Response.Write("命名空间名:" + type.Namespace);
17             Response.Write("<br/>");
18             Response.Write("程序集名:" + type.Assembly);
19             Response.Write("<br/>");
20             Response.Write("模块名:" + type.Module);
21             Response.Write("<br/>");
22             Response.Write("基类名:" + type.BaseType);
23             Response.Write("<br/>");
24             Response.Write("是否类:" + type.IsClass);
25             Response.Write("<br/>");
26             Response.Write("类的公共成员:");
27             Response.Write("<br/>");
28             MemberInfo[] memberInfos = type.GetMembers();//得到所有公共成员
29             foreach (var item in memberInfos)
30             {
31                 Response.Write(string.Format("{0}:{1}", item.MemberType, item));
32                 Response.Write("<br/>");
33             }
34         }

三:获取程序集信息

protected void Button2_Click(object sender, EventArgs e)

{

    //获取当前执行代码的程序集

    Assembly assem = Assembly.GetExecutingAssembly();

    Response.Write("程序集全名:"+assem.FullName);

    Response.Write("<br/>");

    Response.Write("程序集的版本:"+assem.GetName().Version);

    Response.Write("<br/>");

    Response.Write("程序集初始位置:"+assem.CodeBase);

    Response.Write("<br/>");

    Response.Write("程序集位置:"+assem.Location);

    Response.Write("<br/>");

    Response.Write("程序集入口:"+assem.EntryPoint);

    Response.Write("<br/>");

    Type[] types = assem.GetTypes();

    Response.Write("程序集下包含的类型:");

    foreach (var item in types)

    {

        Response.Write("<br/>");

        Response.Write("类:"+item.Name);

    }

}<br>

 四:反射调用方法


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

protected void Page_Load(object sender, EventArgs e)

 {  

     System.Reflection.Assembly ass = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory+"bin\\WebApplication1.dll"); //加载DLL

     System.Type t = ass.GetType("WebApplication1.MainPage");//获得类型

       string name=typeof(MainPage).AssemblyQualifiedName;

     System.Type t1 = Type.GetType(name);

System.Type t2 = typeof(MainPage);

     object o = System.Activator.CreateInstance(t);//创建实例

       System.Reflection.MethodInfo mi = t.GetMethod("RunJs1");//获得方法

       mi.Invoke(o, new object[] { this.Page, "alert(‘测试反射机制‘)" });//调用方法

       System.Reflection.MethodInfo mi1 = t.GetMethod("RunJs");

     mi1.Invoke(t, new object[] { this.Page, "alert(‘测试反射机制1‘)" });//调用方法

 }<br>

 五:反射调用用户/自定义控件


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

       protected override void OnInit(EventArgs e)

        {  

            //生成控件

              CreateControl();

            base.OnInit(e);

        }

        private void CreateControl()

        {

            Table tb = new Table();

            TableRow dr = new TableRow();

            TableCell cell = new TableCell();

            Control c = <span style="color: #ff0000;">LoadControl("WebUserControl1.ascx");

</span>            cell.Controls.Add(c);

            dr.Cells.Add(cell);

            tb.Rows.Add(dr);

            this.PlaceHolder1.Controls.Add(tb);

        }

        protected void Button1_Click(object sender, EventArgs e)

        {

            foreach (TableRow tr in PlaceHolder1.Controls[0].Controls)

            {

                foreach (TableCell tc in tr.Controls)

                {

                    foreach (Control ctl in tc.Controls)

                    {

                        if (ctl is UserControl)

                        {

                            Type type = ctl.GetType();

                            System.Reflection.MethodInfo methodInfo = type.GetMethod("GetResult");

                            string selectedValue = string.Concat(methodInfo.Invoke(ctl, new object[] { }));

                            Response.Write(selectedValue);

                            break;

                        }

                    }

                }

            }

        }<br>

六:反射实现工厂模式


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

public partial class 反射 : System.Web.UI.Page

    {

        protected void Page_Load(object sender, EventArgs e)

        {

            string typeName = typeof(TestClass).AssemblyQualifiedName;

            ITestInterface iface = RawGenericFactory.Create<ITestInterface>(typeName);

            string result = iface.doSomething();

            Response.Write(result);

        }

    }

    public static class RawGenericFactory

    {

        public static T Create<T>(string typeName)

        {

            //Activator.CreateInstance 反射 根据程序集创建借口或者类

            //Type.GetType() 根据名称获得程序集信息

            //typeof(ConcertProduct).AssemblyQualifiedName

            //_iproduct.GetType().AssemblyQualifiedName

            return (T)Activator.CreateInstance(Type.GetType(typeName));

        }

    }

    public interface ITestInterface

    {

        string doSomething();

    }

    public class TestClass : ITestInterface

    {

        public int Id { getset; }

        public override string ToString()

        {

            return Id.ToString();

        }

        public string doSomething()

        {

            return "ok";

        }

    }<br>

 七:自定义ORM框架


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

  [Orm.Table("TestORM")]

        public class TestORM

        {  

            [Orm.Colum("Id",DbType.Int32)]

            public int Id { getset; }

            [Orm.Colum("UserName", DbType.String)]

            public string UserName { getset; }

            [Orm.Colum("Password", DbType.String)]

            public string Password { getset; }

            [Orm.Colum("CreatedTime", DbType.DateTime)]

            public DateTime CreatedTime { getset; }

        }

        protected void Button3_Click(object sender, EventArgs e)

        {

            TestORM t = new TestORM()

            {

                Id=1,

                UserName="binfire",

                Password="xxx",

                CreatedTime=DateTime.Now

            };

            Orm.OrmHelp h=new Orm.OrmHelp();

            h.Insert(t);

        }

namespace Orm

{

    [AttributeUsageAttribute(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]

    public class TableAttribute : Attribute

    {

        //保存表名的字段

        private string _tableName;

        public TableAttribute()

        {

        }

        public TableAttribute(string tableName)

        {

            this._tableName = tableName;

        }

        ///

        /// 映射的表名(表的全名:模式名.表名)

        ///

        public string TableName

        {

            set

            {

                this._tableName = value;

            }

            get

            {

                return this._tableName;

            }

        }

    }

    [AttributeUsageAttribute(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]

    public class ColumAttribute : Attribute

    {

        private string _columName;

        private DbType _dbType;

        public ColumAttribute()

        {

        }

        public ColumAttribute(string columName)

            this()

        {

            this._columName = columName;

        }

        public ColumAttribute(string columName, DbType dbType)

            this(columName)

        {

            this._dbType = dbType;

        }

        //列名

        public virtual string ColumName

        {

            set

            {

                this._columName = value;

            }

            get

            {

                return this._columName;

            }

        }

        //描述一些特殊的数据库类型

        public DbType DbType

        {

            get return _dbType; }

            set { _dbType = value; }

        }

    }

    public class OrmHelp

    {

        public void Insert(object table)

        {

            Type type = table.GetType();

            //定义一个字典来存放表中字段和值的对应序列

            Dictionary<string,string> columValue = new Dictionary<string,string>();

            StringBuilder SqlStr = new StringBuilder();

            SqlStr.Append("insert into ");

            //得到表名子

            TableAttribute temp = (TableAttribute)type.GetCustomAttributes(typeof(TableAttribute), false).First();

            SqlStr.Append(temp.TableName);

            SqlStr.Append("(");

            PropertyInfo[] Propertys = type.GetProperties();

            foreach (var item in Propertys)

            {

                object[] attributes = item.GetCustomAttributes(false);

                foreach (var item1 in attributes)

                {

                    //获得相应属性的值

                    string value = table.GetType().InvokeMember(item.Name, System.Reflection.BindingFlags.GetProperty, null, table, null).ToString();

                    ColumAttribute colum = item1 as ColumAttribute;

                    if (colum != null)

                    {

                        columValue.Add(colum.ColumName, value);

                    }

                }

            }

            //拼插入操作字符串

            foreach (var item in columValue)

            {

                SqlStr.Append(item.Key);

                SqlStr.Append(",");

            }

            SqlStr.Remove(SqlStr.Length - 1, 1);

            SqlStr.Append(") values(‘");

            foreach (var item in columValue)

            {

                SqlStr.Append(item.Value);

                SqlStr.Append("‘,‘");

            }

            SqlStr.Remove(SqlStr.Length - 2, 2);

            SqlStr.Append(")");

            HttpContext.Current.Response.Write(SqlStr.ToString());

        }

    }

}

时间: 2024-10-10 06:53:16

C#反射机制(转)的相关文章

Android小例子:使用反射机制来读取图片制作一个图片浏览器

效果图: 工程文件夹: 该例子可供于新手参考练习,如果有哪里不对的地方,望指正>-< <黑幕下的人> java代码(MainActivity.java): package com.example.imageswitchtest; import java.lang.reflect.Field; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.v

java反射机制(一)—— 利用反射机制实例化对象

一.Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体.或对其fields设值.或唤起其methods.(度娘文库是这么说的) 二.这篇文章主要介绍一下通过反射机制去实例化一个类的对象,然后调用其方法.本文主要介绍两种方式,第一种就是通过构造函数来实例化,第二种就是通过Cl

Java反射机制

Java的反射机制概念 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接.但是反射使用不当会成本很高! 反射的作用 1 可以反编译将class文件编译成java文件 2 可以通过反射机制访问Java对象的属性,方法,构造方法等 反射机制使用步骤 1 得到要调用类的class 2 通过得到的c

【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】

方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; private String name; private Boolean flag; public Integer getNum() { return num; } public void setNum(Integer num) { this.num = num; } public String getNam

使用反射机制调用属性和私有成员与代理模式的介绍

使用反射机制调用属性: 通过反射机制可以获得类的属性,获得到的属性同样的可以进行赋值.得值操作,调用getField方法并传递属性的名称可以获得[学Java,到凯哥学堂kaige123.com]指定的属性,调用getFields方法则可以获得全部属性,但是这种方式不能获得私有属性: 代码示例: Student类示例: 运行结果: 从运行结果可以看出只拿出了公开的属性,私有的属性拿不到. 使用反射机制调用私有成员: 1.调用私有属性 在反射机制里调用私有属性需要通过getDeclaredField

反射机制

反射机制: 反射机制是能够帮助我们把代码变得更加灵活,可扩展性更高,俗称"软编程.软写法".例如:有一个文件里面有一些值,想要把这些值赋值到一个Student类的属性中,按照以前所学到的知识点,只能是通过文件流将文件里的值读取出来,然后再通过set方法将这些值都赋给Student类的属性.但是,这种方式是将代码写死了,在这之后会有一个问题就是如果文件里的内容发生变动,或者要把这个Student类更换成Dog类的话,就要重新修改代码.程序写好了部署到服务器上运行了,总不能时不时就打开来修

Python学习心得(六) 反射机制、装饰器

1.反射机制 #/usr/bin/env python # -*- coding:utf-8 -*- ''' Python反射机制的核心本质:利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动 通俗讲就是通过用户传入url的不同,调用不同的模块函数,好多比较流行的web框架都是通过反射的机制,根据url的不同指向不同的模块 getattr(),hasattr(),setattr(),delattr()对模块的修改都在内存中进行,并不会影响文件中的真实内容

Java 反射机制

使用 Java 反射机制可以在运行时期检查 Java 类的信息,检查 Java 类的信息往往是你在使用 Java 反射机制的时候所做的第一件事情,通过获取类的信息你可以获取以下相关的内容: Class 对象 类名 修饰符 包信息 父类 实现的接口 构造器 方法 变量 注解 除了上述这些内容,还有很多的信息你可以通过反射机制获得,如果你想要知道全部的信息你可以查看相应的文档 JavaDoc for java.lang.Class 里面有详尽的描述. 在本节中我们会简短的涉及上述所提及的信息,上述的

Java的反射机制简述

反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许内部的成员进行操作.虽然这个特性在实际开发中使用的不多,但是像Pascal.C和C++等语言根本没有提供这样的特性.由于反射机制能够实现在运行时对类进行装载,因此能够增加程序的灵活性,但是不恰当地使用反射机制也会严重影响系统的性能. 具体而言,反射机制提供的功能主要有: 1.得到一个对象所属的类: 2.获取一个类的所有成员变量和方法: 3.在运行时创建对象: 4.在运行时调用对象的方法. 其实,反射机制非常重要

Java中的反射机制

Java反射的概念 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制 Java反射机制主要提供下面几种用途: 1.在运行时判断任意一个对象所属的类 2.在运行时构造任意一个类的对象 3.在运行时判断任意一个类所具有的成员变量和方法 4.在运行时调用任意一个对象的方法 首先看一个简单的例子,通过这个例子来理解Java的反射机制是如何工作的 i