C#反射机制(转自Binfire博客)

一:反射的定义

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

  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-11 05:30:26

C#反射机制(转自Binfire博客)的相关文章

Javascript事件传播(冒泡机制) (摘自 博客园 萍水相逢)

今天在使用javascript弹出菜单时遇到了问题,搞了一晌终于算有点眉目了.和大家一起分享下.有什么不对的地方希望大家多多留言评论. 定义:JavaSciprt事件中有两个很重要的特性:事件冒泡 以及目标元素 . 事件冒泡: 当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发.这一过程被称为事件冒泡:这个事件从原始元素开始一直冒泡到DOM树的最上层. 目标元素: 任何一个事件的目标元素都是最开始的那个元素,并且它在我们的元素对象中以属性的形

Java反射机制(四)—番外篇,实例化方法深入

反射机制这几篇博客写下来发现涉及到Java类的加载机制,这部分的内容也比较独立的一部分,因此单另一篇来写.在JAVA中任何的类都是需要加载到JVM中才能运行的.之前Class Loader介绍了类的加载机制,那么这里要说的是不同加载方式之间的对比,好能对JAVA类的实例化过程有更深刻的体会. new和Class.newInstance 我们说代码里出现new关键字意味着对于可能变动的代码,耦合过高了.遇到这种情况我们会用反射机制来去除new关键字,这在代理模式里我们见过了.实际上也就是用了Cla

文顶顶iOS开发博客链接整理及部分项目源代码下载

文顶顶iOS开发博客链接整理及部分项目源代码下载 网上的iOS开发的教程很多,但是像cnblogs博主文顶顶的博客这样内容图文并茂,代码齐全,示例经典,原理也有阐述,覆盖面宽广,自成系统的系列教程却很难找.如果你是初学者,在学习了斯坦福iOS7公开课和跟着文顶顶的博客做项目之后,最快只需要2个月时间,就基本可以独立完成iOS App的开发工作.有经验的开发者也可以在该博客中寻找代码片段进行学习借鉴,必有所收获. 在此也向@文顶顶 表示严重感谢! 由于文顶顶博客博文繁多,每次找文章需要频繁的翻页,

我的Android进阶之旅------&gt;经典的大牛博客推荐(排名不分先后)!!

本文来自:http://blog.csdn.net/ouyang_peng/article/details/11358405 今天看到一篇文章,收藏了很多大牛的博客,在这里分享一下 谦虚的天下 柳志超博客 Android中文Wiki AndroidStudio-NDK开发-移动开发团队谦虚的天下 - 博客园gundumw100博客 - android进阶分类文章列表 - ITeye技术网站CSDN博文精选:Android系列开发博客资源汇总 - CSDN.NET - CSDN资讯Android笔

java 反射机制(我的第一篇博客)

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”.从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时

从零开始,搭建博客系统MVC5+EF6搭建框架(3),添加Nlog日志、缓存机制(MemoryCache、RedisCache)、创建控制器父类BaseController

一.回顾系统进度以及本章概要 目前博客系统已经数据库创建.以及依赖注入Autofac集成,接下来就是日志和缓存集成,这里日志用的是Nlog,其实还有其他的日志框架如log4,这些博客园都有很多介绍,这里就不说了,缓存机制用的是微软自带的MemoryCache和比较流行Redis,这里我也只是了解使用,没有做更升入的研究,以后好好学一下Redis,然后就是实现一个BaseController父类用来重写JsonResult方法为的是返回时间格式问题,默认json返回的时间格式是Date(84923

一篇博客彻底了解Android广播机制

首发于http://blog.csdn.net/pwiling/article/details/47682413,禁止转载 之前数次在程序中碰到Android广播,总是有这个疑问:往往是在发送广播的activity里面进行动态注册,动态注册必须要获得BroadcastReceiver对象,既然我们已经获得了广播接受器的对象,为何还要发送广播,直接用广播接收器的对象调用里面的相关逻辑处理的方法,不行吗?为什么还要绕这么一大圈用广播呢? 以前都是走马观花,这次弄清楚了.在解答这个问题之前,我们首先来

C#博客随笔之七:反射初体验

这篇博客主要要讲的是反射在C#编程中的一些使用: 主要目的是为了让程序能动态识别插件并加载到主程序当中. 这个功能是一个实用的功能. 首先,我们需要定义一个接口 public interface IPlug { /// <summary> /// 获得版本号 /// </summary> /// <returns>返回版本</returns> string GetVersion(); /// <summary> /// 获得插件作者 /// &l

[技术博客]阿里云签名机制字符串的C语言实现

[技术博客]阿里云签名机制字符串的C语言实现 问题描述见:阿里云签名机制 话不多说,上字符串函数转化函数代码 bool AlicloudRequest::sendV2Request() { if( query_parameters.find( "Action" ) == query_parameters.end() ) { this->errorCode = "E_INTERNAL"; this->errorMessage = "No acti