.net学习之泛型、程序集和反射

一、泛型
1.CLR编译时,编译器只为MyList<T>类型产生“泛型版”的IL代码——并不进行泛型的实例化,T在中间只充当占位符。例如:MyList 类型元数据中显示的<T>

2.执行的时候,当JIT编译器第一次遇到MyList<int>时,将用int替换“范型版”IL代码与元数据中的T—进行泛型类型的实例化。例如 :Main函数中显示的<int>

3.什么是泛型
泛型是具有占位符(类型参数)的类、方法、结构、接口

4.泛型类的继承
public class Father<K,V>{} //父类
(1)定义子类时直接为父类泛型参数赋值
public class Son : Father<int,string>
(2)定义子类时把子类泛型参数赋给父类泛型参数
public class Son<W,Y> : Father<W,Y>
(3)定义子类时有子类泛型参数,同时为父类泛型参数赋值
public class Son<W,Y> : Father<int,string>

5.泛型约束
(1)基类约束
private class House<T1, T2> where T1 : Dog where T2 : Cat
{

}
约束T1和T2必须继承Dog类和Cat类
(2)接口约束
class MyPetPlay<T, V> where T : IGetReward<T> where V : IWalk, ISing<V>
{

}
(3)结构和类约束
public class C<T> where T : struct
{
}
public class C2<T> where T : class
{
}
(4)构造函数约束
class Pet<T> where T : new()//T类中必须有无参数的构造函数
{
T t;
public Pet()
{
t = new T();
}
}

6.泛型方法
public int MethodName<T>(T param){...}
public int MethodName<T,K>(T param,K param2){...}
泛型方法 的泛型参数,可以用在该方法的 形参、方法体、返回值三处。

什么是元数据?
元数据(Metadata)描述了程序集的内容。通过将元数据嵌入每个程序集中,任何程序集都可以实现完全的自我描述,从而简化了发布使用较旧技术的组件时所需进行的工作。.NET使用元数据省略组件的注册过程。

程序集就是包含IL和元数据的集合,即从源代码编译生成的。

二、程序集和反射
1.程序集
我们所写的所有代码都会编译到程序集文件中,并在运行时以Assembly对象方式加载到内存中运行。
运行时,类会加载到内存中就是Type对象,类的成员(方法、字段、属性、事件等)加载到内存中也有相应的对象
2.反射
在程序运行时,动态获取加载程序集、动态获取类型(如类、接口等)、动态获取类型的成员信息(如方法、字段、属性等),动态创建类型实例,以及调用和访问这些实例成员。

Dog.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WindowsForms20140808
{
    public class Dog
    {
        public string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public int Age { get; set; }
        private bool gender;

        public string SayHi()
        {
            return this.Name + "," + this.Age + "," + this.gender;
        }
    }
}
 private void button1_Click(object sender, EventArgs e)
        {
            Dog d = new Dog();
            d.Name = "旺旺";
            d.Age = 1;
            d.SayHi();
            //获取当前正在运行的程序集对象
            Assembly ass = this.GetType().Assembly;
            //获取程序集中的Dog类的类型对象
            Type tDog = ass.GetType("WindowsForms20140808.Dog");
            //也可以通过typeOf获取
            //Type tDog = typeof (Dog);

            FieldInfo fInfo = tDog.GetField("name");
            PropertyInfo pInfo = tDog.GetProperty("Name");
            MethodInfo mInfo = tDog.GetMethod("SayHi");
            //根据Dog的Type对象,实例化一个Dog对象
            Dog d2 = Activator.CreateInstance<Dog>();
            //使用Dog类的name字段对象,为d2实例的name字段赋值
            fInfo.SetValue(d2, "小白");

            //调用对象私有成员
            FieldInfo fGender = tDog.GetField("gender", BindingFlags.NonPublic | BindingFlags.Instance);
            fGender.SetValue(d2, true);
            string strRes = mInfo.Invoke(d2, null).ToString();

            //获得当前 程序域中 所有的Assembly
            Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
            //获取当前正在运行的程序集对象
            Assembly ass1 = this.GetType().Assembly;
            //根据路径加载Assembly
            Assembly ass2 = Assembly.LoadFrom("WindowsForms20140808.exe");

        }

.net学习之泛型、程序集和反射,布布扣,bubuko.com

时间: 2024-12-29 05:44:18

.net学习之泛型、程序集和反射的相关文章

程序集和反射(C#)

这里我又唠叨几句,大家在学习的时候,如看书或者看视频时觉得非常爽,因为感觉基本都看得懂也都挺容易的,其实看懂是一回事,你自己会动手做出来是一回事,自己能够说出来又是另一回事了.应该把学到的东西变成自己的东西,而不是依样画瓢. 在说反射之前,我们先来了解一下什么是程序集? 程序集 程序集是.net中的概念,程序集可以看作是给一堆相关类打一个包,相当于java中的jar包. 程序集包含: 资源文件 类型元数据(描述在代码中定义的每一类型和成员,二进制形式) IL代码(这些都被封装在exe或dll中)

C#中的程序集和命名空间

C#中的程序集和命名空间 如果说命名空间是类库的逻辑组织形式,那么程序集就是类库的物理组织形式.只有同时指定类型所在的命名空间及实现该类型的程序集,才能完全限定该类型.<精通.NET核心技术--原理与架构> 程序集和命名空间不存在必然联系,一个程序集可以包含多个命名空间,同一个命名空间也可以分放在几个程序集. 程序集是应用程序的部署单元..NET应用程序包含一个或多个程序集.通常扩展名是EXE或DLL 的.NET可执行程序称为程序集..NET程序集包含元数据,这些元数据描述了程序集中定义的所有

Dao泛型设计和反射反型

(1)DAO泛型设计:当二哥或多个类中有类似的方法时,可以将这些累死的方法提出到类中,形式一个泛型父类 (2)反射反型:在泛型父类中获取子类的具体类型的过程,叫反射反型 1 package cn.itcast.web.generic; 2 3 import java.lang.reflect.ParameterizedType; 4 import java.lang.reflect.Type; 5 import org.apache.commons.dbutils.QueryRunner; 6

linux学习笔记--vim程序编辑器

1,在linux系统中使用文本编辑器来编辑自己的linux参数配置文件是一件很重要的事情,因此系统管理员至少应该要熟悉一种文本编辑器. 2,不同的linux distribution各有不同的附加软件,linux命令行界面下的文本编辑器有Emacs,pico,nano,joe与vim 3,学习vim的重要性 (1)所有的UNIX Like系统都内置vi文本编辑器,其他的文本编辑器不一定存在 (2)很多软件的编辑接口都会主动调用vi (3)vim具有程序编辑的能力,可以主动以字体颜色辨别语法的正确

程序集和应用程序域

.NET程序集用于解决DLL HELL(即与DLL相关的问题).程序集是自我描述的逻辑单元,而非一个文件.程序集可以是包含元数据的文件,也可以是一个DLL或者EXE文件.总之,程序集是作为整体发布的.NET可执行程序或者是.NET可执行程序的一部分. 程序集分为私有程序集和共享程序集,私有程序集是创建.NET项目时默认的,私有程序集以可执行程序或者库的形式提供给应用程序,库中的代码只服务于这个应用程序.而共享程序集是一个公共库,可服务于系统的所有程序.共享程序集安装到.NET的特别目录下,而其他

cocos2d-x学习日志(18) --程序是如何开始运行与结束?

问题的由来 怎么样使用 Cocos2d-x 快速开发游戏,方法很简单,你可以看看其自带的例程,或者从网上搜索教程,运行起第一个HelloWorld,然后在 HelloWorld 里面写相关逻辑代码,添加我们的层.精灵等 ~ 我们并不一定需要知道 Cocos2d-x 是如何运行或者在各种平台之上运行,也不用知道 Cocos2d-x 的游戏是如何运行起来的,它又是如何渲染界面的 ~~~ 两个入口 程序入口的概念是相对的,AppDelegate 作为跨平台程序入口,在这之上做了另一层的封装,封装了不同

Java反射学习总结终(使用反射和注解模拟JUnit单元测试框架)

本文是Java反射学习总结系列的最后一篇了,这里贴出之前文章的链接,有兴趣的可以打开看看. http://blog.csdn.net/a396901990/article/category/2302221 本文介绍了如何利用反射和注解去简单的模拟JUnit4单元测试框架,之所以选择JUnit4是因为4.0以后最大的改进就是使用了注解.需要注意的是这里并不是完全的模拟,只是简单实现了一下Runner类和JUnit注解相关的工作流程.所以本文的主要目的是介绍反射和注解的使用.废话不多说,直接进入正文

asp.net mvc本地程序集和GAC的程序集冲突解决方法

一个从asp.net mvc 3升级到asp.net mvc 4的项目发生了如下错误: [A]System.Web.WebPages.Razor.Configuration.HostSection cannot be cast to [B]System.Web.WebPages.Razor.Configuration.HostSection. Type A originates from 'System.Web.WebPages.Razor, Version=1.0.0.0, Culture=n

C#学习之泛型继承和静态成员

想要理解这里有必要先将泛型类学习充分.这里讲解的是泛型类继承类的类型和静态成员. 在前面C#学习之泛型中,创建的LinkList<T>类实现了IEnumerable<T>接口. 即泛型类也可以实现泛型的接口,也可派生自一个类.泛型类也可以派生自泛型基类. public class Base<T> { } public class Derived<T>:Base<T> { } 也可以指定基类的类型,可以执行某些特定操作 public class D