泛型反射

. 泛型回顾

1. 泛型参数可以有多个。

2. 开放类型(泛型类)和封闭类型(泛型类的实例)。

3. 泛型类的继承

4. 泛型约束(where T : new() – 目前.NET只支持无参构造函数的约束)

(1)构造函数约束;

(2)基类约束;

(3)struct/class约束;

(4)构造器约束;

5. 泛型方法的类型参数,可以用在该方法的形参,方法体,返回值三处。

6. 泛型方法的重载,类型参数和方法参数列表都是构成重载的元素。

7. 泛型方法的重写

程序示例:

 1 public class Father
 2     {
 3         public virtual T Shout<T>() where T : new()
 4         {
 5             return new T();
 6         }
 7     }
 8     public class Son : Father
 9     {
10         //约束自动从父类继承下来
11         public override T Shout<T>()
12         {
13             return new T();
14         }
15 }

8. 协变和逆变

协变:子类对象转父类对象。(out T)

逆变:父类对象转子类对象。(in T)

. 反射

1. 程序集的组成

2. 程序示例

 1 private void btnGetAssemblyTest_Click(object sender, EventArgs e)
 2         {
 3             //获取当前运行的程序里的程序集
 4             Assembly[] asss = AppDomain.CurrentDomain.GetAssemblies();
 5
 6             Dog d = new Dog();
 7
 8             //***********************反射创建成员************
 9             //1. 获取当前正在运行的程序集(AssemBly)对象
10             Assembly ass = this.GetType().Assembly;
11             //2. 获取程序集中Dog类的类型(Type)对象
12             Type tDog = ass.GetType("反射.Dog");
13             //3. 获取Dog类的字段
14             FieldInfo fInfo = tDog.GetField("name");
15             //4. 获取方法
16             MethodInfo mInfo = tDog.GetMethod("ShouHi");
17
18             //***********************反射调用成员*************
19             //5. 根据Dog的Type对象实例化一个Dog对象
20             Dog d2 = Activator.CreateInstance(tDog) as Dog;
21             //Dog d3 = Activator.CreateInstance<Dog>();
22
23             //6. 使用Dog类的name字段对象,为d2实例的name字段赋值
24             fInfo.SetValue(d2, "小白");
25
26             //7. 调用反射中的方法
27             string strRes = mInfo.Invoke(d2, null).ToString();
28         }
29
30         private void btnLoadAssembly_Click(object sender, EventArgs e)
31         {
32             //根据路径加载Assembly
33             string strPath = @"C:\Users\腾\Documents\visual studio 2013\Projects\泛型反射\反射\libs\反射.exe";
34             Assembly ass = Assembly.LoadFrom(strPath);
35         }
36
37         private void btnLoad_Click(object sender, EventArgs e)
38         {
39             BLL.Class1 c = new BLL.Class1();
40
41             //并不是所有外部添加的引用都会加载,只有用到才会被JIT加载进来
42             Assembly[] asss = AppDomain.CurrentDomain.GetAssemblies();
43         }
44
45         private void btnGetType_Click(object sender, EventArgs e)
46         {
47             Assembly ass = this.GetType().Assembly;
48             //1. 通过类的全名称获取类的类型对象
49             Type t = ass.GetType("反射.Dog");
50             //2. 通过程序集获取所有的公共(public)类型
51             Type[] types = ass.GetExportedTypes();
52             //3. 通过程序集获取所有的类型
53             Type[] typesAll = ass.GetTypes();
54
55             //获取单个类型对象
56             //1. 通过类 直接获取 类型对象
57             Type t2 = typeof(Dog);
58             //2. 通过对象 来获取 类型对象
59             Type t3 = this.GetType();
60
61             Dog d3 = new Dog();
62             Type t4 = d3.GetType();
63         }

3. 小案例 – 记事本插件

时间: 2024-11-01 19:50:13

泛型反射的相关文章

泛型反射常见应用,通过类型创建实例,通过反射实现增删改查

public class Test { public void MyObj<T>() where T : class { //T t = new T(); T t =System.Activator.CreateInstance<T>(); //获取类型跟字段然后拿到对应名字方法跟字段就可以了 } } 微信官方创建实体的方法,通过泛型类型创建实例System.Activator.CreateInstance<T>(); 新增: public static void Ad

Java泛型反射机制(二)

/** * @author Administrator * 好处:泛型:1安全 2减少代码重用率 */ package com.test; import java.lang.reflect.Method; public class Test2 { public static void main(String[] args) { // TODO Auto-generated method stub // Gen<String> gen1 = new Gen<String>("

java 反射和泛型-反射来获取泛型信息

通过指定对应的Class对象,程序可以获得该类里面所有的Field,不管该Field使用private 方法public.获得Field对象后都可以使用getType()来获取其类型. Class<?> type = f.getType();//获得字段的类型 但此方法只对普通Field有效,若该Field有泛型修饰,则不能准确得到该Field的泛型参数,如Map<String,Integer>; 为了获得指定Field的泛型类型,我们采用: Type gType = f.getG

Java泛型反射机制(一)

/** * * @author Administrator * 功能:泛型的必要性(参数化类型)(安全简单) */ package com.test; import java.util.*; public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub // ArrayList al = new ArrayList(); //

Java的泛型反射

If the superclass is a parameterized type, the {@code Type} * object returned must accurately reflect the actual type * parameters used in the source code. T 上文档DOC,如果父类是一个参数化类型,那么Type返回的是参数类型的真实类型 package entity; import java.lang.reflect.Parameteriz

Type.MakeGenericType 方法 (Type[]) 泛型反射

替代由当前泛型类型定义的类型参数组成的类型数组的元素,并返回表示结果构造类型的 Type 对象. 命名空间:   System程序集:  mscorlib(mscorlib.dll 中) public virtual Type MakeGenericType( params Type[] typeArguments ) 参数typeArguments将代替当前泛型类型的类型参数的类型数组. 返回值Type: System.TypeType 表示的构造类型通过以下方式形成:用 typeArgume

npoi2.3+泛型+反射 根据配置统一解析excel数据到实体的基础方法

解析方法: /// <summary> /// excel数据解析到实体 /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <param name="sheet">npoi读取到的excel工作表,需要解析的工作表</param> /// <param name="startRowIndex">

java反射+java泛型,封装BaseDaoUtil类。供应多个不同Dao使用

当项目是ssh框架时,每一个Action会对应一个Service和一个Dao.但是所有的Ation对应的Dao中的方法是相同的,只是要查的表不一样.由于封装的思想,为了提高代码的重用性.可以使用java中的泛型+反射去实现最终的封装,将所有的Dao层的共同部分写一个BaseDaoUtil.而所有的Dao都继承这个类. 思路: ----->(1)反射+泛型 ----->(2)当生成子类对象(UserDao),调用空构造时(new UserDao()),子类的空构造会默认调用父类的空构造器(new

反射机制--总结

1.反射的概念: Reflection(反射) 被视为 动态语言的关键,反射机制允许程序在执行的时候借助Reflection的API 获取任何类的内部信息,直接操作任何对象的内部属性和方法. 2.Object类中定义Class 类:反射从程序允许结果看:利用Java编译生成.class文件反编译原来的Java---通过对象反射求出类的名称   1). 反射的理解:反射通过动态的设置内部的属性和方法,在反射的过程中,我们事先不知道 类的名称是什么,采用getClass() 方法获取一个实体的类型-