首页 > 代码库 > 泛型反射
泛型反射
一. 泛型回顾
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 //根据路径加载Assembly33 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. 小案例 – 记事本插件
泛型反射
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。