.Net Reflection反射技术

这里写一下个人对.Net下反射技术的理解:

第一部分:个人讲讲反射

反射机制是一种运行时获取类(Type对象)和动态调用对象的成员的机制。

a.可以获取有关已加载的程序集和在其中定义的类型(如类、接口和值类型)的成员信息;

b.可以使用反射在运行时创建指定类的对象,以及调用和访问这些对象的成员。

这种动态获取的信息以及动态调用对象的方法的功能称为反射机制。

比如在myReflect.UI下定义了一个MyLyfeng类:

public class MyLyfeng
    {
       //无参构造函数

//有参数构造函数
       public MyLyfeng(string name)
       {
           this.name = name;
       }
       //私有字段
        private int beautyNum;

public int BeautyNum
        {
            get { return beautyNum; }
            set { beautyNum = value; }
        }

private string name;

public string Name
        {
            get { return name; }
            set { name = value; }
        }

//带返回值无参数公共方法
       public string SayName()
       {
           //逻辑
           return null;
       }
       //无参数无返回值私有方法
       private void Sleep()
       {
         //逻辑
       }
       //有参无返回值
       public void SayHello(string name)
       {
         //逻辑
       }
       //有参数有返回值
       public string ReturnParam(string param)
       {
           return param;
       }
    }

1.一般情况想要得到MyLyfeng类的实例对象,那么只需要一句代码:

//MyLyfeng lyf = new MyLyfeng() { BeautyNum=100};
     MyLyfeng lyf2 = new MyLyfeng("My");

除了以上使用new的方法之外,还可以使用Reflection技术对MyLyfeng类进行操作.

2.本地动态创建

Type type=typeof(MyLyfeng);//本地可以访问到MyLyfeng类
               //无参构造函数
               object obj=Activator.CreateInstance(type);
               //有参构造函数
              ConstructorInfo c= type.GetConstructor(new Type[]{typeof(string) });//构造函数的实参类型
              c.Invoke(new object[] { "name"});//实参
            //公共的

//字段操作
                   FieldInfo field= type.GetField("name");
                   field.GetValue(obj);//obj.field
                   field.SetValue(obj,"Lyfeng");
                    //属性操作
                   PropertyInfo  property =type.GetProperty("BeautyNum");
                   property.GetValue(obj, null);//obj.BeautyNum
                   property.SetValue(obj, 101,null);

//私有的
                   //字段操作
                    FieldInfo[] fields =type.GetFields(BindingFlags.NonPublic);
                    foreach (FieldInfo item in fields)
                    {
                        
                    }
                     //属性操作
                    PropertyInfo[] propertys = type.GetProperties(BindingFlags.NonPublic|BindingFlags.Instance);
                    foreach (PropertyInfo item in propertys)
                    {
                        
                    }
            //方法操作
                    //无参无返回值
                   MethodInfo method=type.GetMethod("Sleep");
                   method.Invoke(obj, null);
                    //有参无返回值
                   MethodInfo method1 = type.GetMethod("SayHello");
                   method1.Invoke(obj, new object[] { "name"});
                    //无参有返回值
                    MethodInfo method2=type.GetMethod("SayName");
                    object returnValue=method2.Invoke(obj,null);
                    //有参数又返回值
                    MethodInfo method3=type.GetMethod("ReturnParam");
                    object ReturnValue=method3.Invoke(obj,new object[]{"param"});
            //接口操作
                   //判断当前type是否实现IHarry接口
                    typeof(IHarry).IsAssignableFrom(type);

以上是一些比较的常用用法的列举,但是,在实际开发中我们可能并不能直接访问到MyLyfeng,那么需要进行一小点的改动,代码如下:

3.异地动态创建

假设在另一个类库IFrancis中有一个Francis类,在myReflection.UI下不能访问到它,我们只需要将IFrancis.dll生成到(或者复制一份到myReflection.UI到bin下),

然后使用反射得到实例对象:

string path=AppDomain.CurrentDomain.BaseDirectory;
              Assembly ass = Assembly.LoadFrom(path + "IFrancis.dll");
              Type ftype= ass.GetType("IFrancis.Francis");
              object fobj=Activator.CreateInstance(ftype);
                  //剩余同理

第二部分:个人用用反射

使用反射技术,动态拼接sql语句

Insert示例1:

int beautyNum = 102;
string name = "name";

System.Text.StringBuilder sb = new StringBuilder()

Assembly ass = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + "IFrancis.dll");
Type type = ass.GetType("IFrancis.Francis");
string tableName = type.Name;

sb.AppendFormat(" Insert into {0} (", tableName);
PropertyInfo[] propertys = type.GetProperties();
foreach (PropertyInfo item in propertys)
{
    sb.Append(item.Name + ",");
}
//去掉逗号
sb.Remove(sb.Length - 1, 1);
sb.Append(") values(" + beautyNum + ",‘" + name + "‘)");
Note:这样的写法,是根据IFrancis.dll程序集的属性为准来生成sql语句,一般的话,我个人会使用另外一种,根据Model实体对象来作为依据:
Insert示例2:

MFrancis model = new MFrancis() { BeautyNum = 103, Name = "name" };
 string where = " where ....";

System.Text.StringBuilder updatesb = new StringBuilder();

Type type=Typeof(MFrancis);

string tableName=type.Name;

sb.AppendFormat(" insert into {0} (",tableName);
            PropertyInfo[]  PI= typeof(MFrancis).GetProperties();
            List<SqlParameter> list2 = new List<SqlParameter>();
            for (int i = 0; i < PI.Length; i++)
            {
                sb.Append(PI[i].Name+",");
            }
            sb.Remove(sb.Length-1,1);
            sb.Append(") values(");
            for (int i = 0; i < PI.Length; i++)
            {
                sb.Append("@"+PI[i].Name+",");
                SqlParameter p = new SqlParameter("@"+PI[i].Name,PI[i].GetValue(model,null));
                list2.Add(p);
            }
            sb.Remove(sb.Length-1,1);

update示例:

System.Text.StringBuilder updatesb = new StringBuilder();

PropertyInfo[] pi = typeof(MFrancis).GetProperties();//Model
            
            List<SqlParameter> list = new List<SqlParameter>();
            updatesb.AppendFormat("update {0} set ", tableName);

for (int i = 0; i < pi.Length; i++)
            {
                updatesb.AppendFormat(pi[i].Name + "[email protected]" + pi[i].Name + ",");
                SqlParameter ps = new SqlParameter("@" + pi[i].Name, pi[i].GetValue(model, null));//类.属性名
                list.Add(ps);
            }
            updatesb.Remove(updatesb.Length - 1, 1);
            if (string.IsNullOrEmpty(where))
            {
                updatesb.Append(where);
            }
这里的update和insert语句并不完整,因为实际还有where条件的存在,需要根据Primkey主键来拼接成一句完整的sql;另外的就是还有Model实体对象的合法性验证;

时间: 2024-10-05 16:25:18

.Net Reflection反射技术的相关文章

C#反射技术概念作用和要点

反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的名称.限定符和参数等.有了反射,即可对每一个类型了如指掌.如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道. 1..NET可执行应用程序结构 程序代码在编译后生成可执行的应用,我们首先要了解这种可执行应用程序的结构. 应用程序结构分为应用程序域—程序集—模块—类型—成员

C# 反射技术应用

反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的名称.限定符和参数等.有了反射,即可对每一个类型了如指掌.如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道. 反射是一种机制,通过这种机制我们可以知道一个未知类型的类型信息.比如,有一个对象a,这个对象不是我们定义的,也许是通过网络捕捉到的,也许是使用泛型定义的,但我们

C#反射技术的简单操作(读取和设置类的属性)

public class A { public int Property1 { get; set; } } static void Main(){ A aa = new A(); Type type = aa.GetType();//获取类型 System.Reflection.PropertyInfo propertyInfo = type.GetProperty("Property1"); propertyInfo.SetValue(aa, 5, null);//给对应属性赋值 i

android中反射技术使用实例

在计算机科学领域,反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义.反射 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性.Java 的反射机制的实现要借助于4个类:class,Constructor,Field,

Java中类加载机制和反射技术

我们知道一个对象在运行时有两种类型,一个是编译类型,一个是运行时类型.在程序运行时,往往是需要发现类和对象的真实的信息的.那么如何获的这种信息呢? 其一,如果我们在编译和运行时都知道类型的具体信息,这时是可以手动将一个对象转换为运行时的类型. 其二,如果我们在编译时无法预知对象和类到底是属于哪些类,那么程序只有依靠运行时的信息来发现对象和类的真实的信息了,这时就必须要用到反射技术. 在谈具体的发射技术之前,我想先回顾下,有关类的加载的一些基本的性质和原理,以方便我们更好地理解,反射的作用和特点.

7. 反射技术:其实就是动态加载一个指定的类

反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员.简单说:反射技术可以对一个类进行解剖. 反射的好处:大大的增强了程序的扩展性. 反射的基本步骤: 1.获得Class对象,就是获取到指定的名称的字节码文件对象. 2.实例化对象,获得类的属性.方法或构造函数. 3.访问属性.调用方法.调用构造函数创建对象. 获取这个Class对象,有三种方式: 1:通过每个对象都具备的方法getClass来获取.

Java反射技术学习总结

-------<a href="http://www.itheima.com/"">android培训</a>.<a href="http://www.itheima.com/" ">java培训</a>期待与您交流!---------- Java反射技术就是将java中的类的各个组成部分反射出来变为java中相应的数据类型获得. Java同样将类中的各个组成部分进行封装,变为一个个Java类. C

代替Reflection(反射)的一些方法

Reflection(反射)是深入学习.Net必须掌握的技能之一.最初学Reflection的时候,的确是被惊住了,原来还可以这样.只要给你一个Assembly, 你就能获取到其中所有的类型,根据类型,你能够创建和操作对象的属性和方法,甚至是私有的.但是,每次使用Reflection,看着那些丑陋难懂的代码,都让人不敢直视.下面就介绍一些在特定场景下可以替换Reflection的方法. 1. 使用Reflection完成的简单Demo 我们首先创建一个Person类,这个类非常简单,一个Name

反射技术

反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员.简单说:反射技术可以对一个类进行解剖. 反射的好处:大大的增强了程序的扩展性. 反射的基本步骤: 1.获得Class对象,就是获取到指定的名称的字节码文件对象. 2.实例化对象,获得类的属性.方法或构造函数. 3.访问属性.调用方法.调用构造函数创建对象. 获取这个Class对象,有三种方式: 1:通过每个对象都具备的方法getClass来获取.