准备项目
1.新建一个空的解决方案MyProj.sln
2.在该解决方案下,建一个控制台项目P01.csproj
3.在该项目下,自己新建一个类MyFirstClass.cs
查看解决方案MyProj.sln,知道本次要编译哪个项目
查看项目文件P01.csproj(其实就是一个xml文档),可以知道本次程序会编译的类
类库编译成程序集
在bin目录下生成*.dll或*。exe
程序集包含哪些内容:
类型元数据【以二进制的形式,描述代码中定义的每一个类型和成员】
程序集元数据【程序集清单,版本号,名称等】
IL代码【这些都被装在exe或dll中】
资源文件【比如图片这些】
说明:程序集是在硬盘上的,如果每次要用到某个类的话,都去硬盘上读,速度会很慢,
所以VS会在程序第一次运行的时候,将程序集加载到内存中运行。
程序集(*.dll,*exe) -->加载到 内存中 就是Assembly对象
类(接口)--> 加载到内存中就是 Assembly下的Type对象
类的成员 --> 加载到内存 就是 Type下的相应对象(FieldInfo,PropertyInfo,MethodInfo,EventInfo)
 
什么是反射:
1.在程序运行时,
             动态 获取 加载程序集
             动态 获取 类型(类,接口)
             动态 获取 类型的成员 信息(字段,属性,方法)
2.在运行时,
             动态 创建类型实例,以及 调用 和访问 这些 实例 成员
程序集(Assembly对象)===》类,接口(Type对象)===》类的成员(**Info)
 
获取Assembly的方式:
获取当前 应用程序域中 所有的Assembly:
       AppDomain.CurentDomain.GetAssemblies();
获取当前 对象 所在的 Assembly
       this.GetType().Assembly
根据路径加载Assembly
      Assembly.LoadFrom(命名空间.类名)
获取Type对象的方式
1.通过类 获得 对应
         Type:Type t = typeof(Person)
2.通过对象 获得
         Type:Type t = p.GetType()
3.根据类的全名称 获取程序集中定义的类
         Type type = Assembly.GetType(“命名空间.类名”)
4.获取程序集中定义的所有的public类
         Type[] types = assembly.GetExportedTypes
5.获取程序集中定义的所有的类型
         Type[] types = assembly.GetTypes()
获取Type的成员
属性:
        type.Assembly:获取type所在程序集对象
        type.FullName:获取type对象对应的类的全名称
        type.Name:获取type对象对应类的 名称
        type.IsArray:判断type是否为一个数组类
        type.IsEnum:判断type是否为一个枚举类
方法:
        type.IsAssignableFrom(Type i):判断type是否实现了接口i
        type.IsSubclassOf(Type father):判断type是否继承了father
        type.IsInstanceOfType(object o):判断o是否为type类的实例

type.GetFiled(“gender“):获取type中名为gender的字段对象
        type.GetProperty(“Age”):获取type中名为Age的属性对象
        type.GetMethod(“SayHi”):获取type中名为SayHi的方法对象

反射- FiledInfo字段对象

static void Main(string[] args)
{
Dog dObj=new Dog()
{
dogName = "小白",
dogAge =
};
Type dType = dObj.GetType();
//获取字段对象
FieldInfo fieldDogName = dType.GetField("dogName");
//获取dObj对象的dogName字段值,即dObj.dogName
string strName = fieldDogName.GetValue(dObj) as string;
//设置dObj里dogName字段赋值
fieldDogName.SetValue(dObj,"小黑"); Console.WriteLine(dObj.dogName);
Console.ReadKey();
}

反射-PropertyInfo属性对象

static void Main(string[] args)
{
Dog dObj = new Dog() {Name = "小白", Age = };
Type dType = dObj.GetType();
//获取属性对象
PropertyInfo proName = dType.GetProperty("Name");
//获取dObj对象的Name属性,即dObj.Name
string strName = proName.GetValue(dObj) as string;
//设置dObj里面Name属性值
proName.SetValue(dObj,"小黑"); Console.WriteLine(dObj.Name);
Console.ReadKey();
}

反射-MethodInfo方法对象

static void Main(string[] args)
{
Dog dObj=new Dog();
Type dType = dObj.GetType();
MethodInfo method = dType.GetMethod("Smile");
//普通调用方法
object res1 = dObj.Smile("小白");
//反射调用dObj的Smile方法,即dObj.Smile("小黑")
//第一个参数是实例对象,第二个参数是方法的参数数组
object res2 = method.Invoke(dObj, new object[] {"小黑"}); Console.WriteLine(res1+" \n"+res2);
Console.ReadKey();
}

动态创建对象

static void Main(string[] args)
{
//方法一:通过Activator 动态创建对象
Type dType = typeof (Dog);
//调用带两个参数的构造函数
Dog dogXB = Activator.CreateInstance(dType,new object[]{"小白",}) as Dog;
Console.WriteLine(dogXB.Name+"\t"+dogXB.Age); //方法二:使用 构造器 动态创建对象
Type dTypeXH = typeof (Dog);
//获得 带两个参数的 构造函数
ConstructorInfo ctor = dType.GetConstructor(new Type[] {typeof (string), typeof (int)});
//创建 指定构造函数
Dog dogXH = ctor.Invoke(new object[] {"小黑", }) as Dog;
Console.WriteLine(dogXH.Name+"\t"+dogXH.Age); Console.ReadKey();
}

C#学习-程序集和反射的更多相关文章

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

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

  2. C# 篇基础知识9——特性、程序集和反射

    特性(Attribute)是用于为程序元素添加额外信息的一种机制.比如记录文件修改时间或代码作者.提示某方法已经过期.描述如何序列化数据等等.方法.变量.属性.类.接口.结构体以及程序集等都是程序元素 ...

  3. 程序集和反射(C#)

    这里我又唠叨几句,大家在学习的时候,如看书或者看视频时觉得非常爽,因为感觉基本都看得懂也都挺容易的,其实看懂是一回事,你自己会动手做出来是一回事,自己能够说出来又是另一回事了.应该把学到的东西变成自己 ...

  4. C#编程之程序集和反射

    这里我又唠叨几句,大家在学习的时候,如看书或者看视频时觉得非常爽,因为感觉基本都看得懂也都挺容易的,其实看懂是一回事,你自己会动手做出来是一回事,自己能够说出来又是另一回事了.应该把学到的东西变成自己 ...

  5. c#基础语言编程-程序集和反射

    程序集 什么是程序集? 1.程序集(assembly)是一个及一个以上托管模块,以及一些资源文件的逻辑组合. 2.程序集是组件复用,以及实施安全策略和版本策略的最小单位. 3.程序集是包含一个或者多个 ...

  6. Java学习:注解,反射,动态编译

    狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! Java学习:注解,反射,动态编译 Annotation 注解  什么是注解 ? Annotat ...

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

    一个从asp.net mvc 3升级到asp.net mvc 4的项目发生了如下错误: [A]System.Web.WebPages.Razor.Configuration.HostSection c ...

  8. 教你50招提升ASP.NET性能(三):使用Microsoft的PDBs调试和分析外部的程序集和库

    (3)Use Microsoft’s PDBs to debug or profile external assemblies or libraries 招数3: 使用Microsoft的PDBs调试 ...

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

    C#中的程序集和命名空间 如果说命名空间是类库的逻辑组织形式,那么程序集就是类库的物理组织形式.只有同时指定类型所在的命名空间及实现该类型的程序集,才能完全限定该类型.<精通.NET核心技术-- ...

随机推荐

  1. vb 运行ppt示例代码

    来源:http://support.microsoft.com/kb/222929 通过使用 PowerPoint 中的自动运行功能,您可以以编程方式打印.显示幻灯片及执行以交互式执行的大多数事情.按 ...

  2. [luoguP3252] [JLOI2012]树(DP)

    传送门 树上前缀和. 在树上找一条权值和为 s 的链,其中这个链上的点按深度递增(递减)(不同) dfs 每搜到一个点求它的前缀和 sum[x],放入 set 中. 在 set 中找 sum[x] - ...

  3. 转载 - C - 枚举类型详解

    出处:http://www.cnblogs.com/JCSU/articles/1299051.html 注:以下全部代码的执行环境为VC++ 6.0 在程序中,可能需要为某些整数定义一个别名,我们可 ...

  4. [24点计算器][C++版本]无聊拿去玩

    特性:数字数量.目标答案不限,当然数据大了会很慢... 基本可以去除所有本质相同的表达式...至少能等出结果的数据规模可以.. 安卓:http://yun.baidu.com/s/1slCGILn 程 ...

  5. Java中原始数据类型存放位置理解

    原始数据类型的变量存放在栈还是堆,应该由上下文去决定. 如下所示的局部方法中,定义了本地变量a,且为原始数据类型,所以存放在栈中. public void func(){ int a = 3; } 再 ...

  6. 3deye-demo-8-14-26-51

    源码

  7. MVC WebApi 将返回值改为JSON格式

    新增一个类: public class BrowserJsonFormatter : JsonMediaTypeFormatter { public BrowserJsonFormatter() { ...

  8. BC #62 div1 02

    /* 数位DP题,设dp[n][k][j]为前n位最后一位是k时mod为j的个数.操作都相同,可以使用矩阵加速.本来对于每一位是7*10,可以把它压向一个向量. 加速矩阵为70*70,再加一维计算前缀 ...

  9. Win7 系统管理员设置了系统策略_禁止进行此安装_怎么办

    系统管理员设置了系统策略,禁止进行此安装,怎么办 最佳答案 尝试方法一:   windows开始菜单,运行里面输入gpedit.msc打开组策略,   在"计算机配置"→管理模板→ ...

  10. Android实现一个自己定义相机的界面

    我们先实现拍照button的圆形效果哈.Android开发中,当然能够找美工人员设计图片,然后直接拿进来.只是我们能够自己写代码实现这个效果哈.最经常使用的的是用layout-list实现图片的叠加, ...