反射定义
反射就是审查元数据并收集关于它的类型信息的能力.
那元数据又是个啥东东呢?元数据是程序集里的东西. 我们知道程序编译之后会生成很多dll,它就是程序集,一般是一个project对应一个程序集吧.一个程序集(assembly)就是一个dll或exe文件(不过据说有多文件程序集,不知道是不是一个程序集是多个dll,没研究过啊).当然不是所有的dll文件都叫程序集.其他程序语言,比如C++中也会有dll,我们一般就叫动态链接库.不是程序集.程序集里除了可执行指令外还有元数据.元数据就是一大堆的表,有类定义表,字段定义表,方法定义表.另外还有版本等信息.它有点像个目录一样,告诉我们程序集中有些啥内容.
我们大部分时候应该是不需要去知道程序集里元数据的信息的.也就是不需要用到反射的.那啥时候需要用反射呢?
正常情况下我们要使用某个dll的话直接添加引用,然后引用命名空间.接下来就可以使用其中的类了.那如果事先约定好某个dll中会有些啥类和函数.但是那dll还没做好.你写代码时又要用到,那咋整啊.总不能傻等着别人做完你再写代码吧.另外如果那dll暂时没打算写,等以后再扩充就更是如此了.这会就可以用到反射了.你可以先写代码Load某个dll(不一定要实际存在),然后获取里面类和函数信息,然后调用.这是调用别的dll时用到,调用本身所在的dll也可以用到反射,比如一般软件都会有个"关于"的菜单选项,点下会弹出软件的版本信息.通过从程序集中可以获取版本信息,不用再去注册表或其他哪去获取了.另外我们用VS时智能感应让我们用起来很方便,随便敲几个字母带出一堆信息.这里也是用到反射.
特性(atrribute)定义
atrribute有时也被翻译成属性,但是容易和property(属性)混淆.atrribute指可以应用到代码块(比如类,方法,属性)上的额外信息.
比如我们在使用序列化的时候会用到特性[Serializable],当要想把某个类序列化必须得在类前面加个这样的特性.特性的用法就是一个中括号号,然后里面加些啥信息.
除了使用类库定义好的特性我们还可以自定义些特性.特性的信息会被保存到程序集中,反射的时候可以用到.
反射具体用法
举个简单例子,假如有个dll文件MyDll.dll,里面有个类YourName,类里有个方法ShowYourName().现在想通过动态加载这个dll然后通过反射去实例化类YourName,并调用类中的方法.
dll中类YourName的定义如下
using System;
namespace MyDll
{
class YourName
{
public void ShowYourName()
{
Console.WriteLine("Hi,I am arwen.");
}
}
}
调用的代码如下.先引用命名空间using System.Reflection;
string dllPath = @"D:\MyDll.dll"; //dll文件所在路径
Assembly asm = Assembly.LoadFrom(dllPath); //动态加载dll
Type yourName = asm.GetType("MyDll.YourName"); /*获取类型YourName.Type可以代表反射获得的class,interface等任何类型.有点像object可以代表任何类一样了*/
object obj = Activator.CreateInstance(yourName); //实例化类YourName
MethodInfo function = yourName.GetMethod("ShowYourName"); //获取方法ShowYourName
function.Invoke(obj, null); //调用方法ShowYourName
自定义特性用法
举个简单的例子,新建一个用来添加注释的特性,其实自定义特性就是新建一个class
class MyAtrribute: Attribute //必须继承Atrribute,其它就跟一般类完全一样
{
public string Note { get; set; }
public MyAtrribute(string msg)
{
Note = msg;
}
public void ShowNote()
{
Console.WriteLine(Note);
}
}
然后在类前面添加
[MyAtrribute("this class is used for showing your name")]
class YourName
{
//就用前面的类YourName
}
在反射中使用自定义特性的信息
string dllPath = @"D:\MyDll.dll";
Assembly asm = Assembly.LoadFrom(dllPath);
Type yourName = asm.GetType("MyDll.YourName");
Attribute[] notes = Attribute.GetCustomAttributes(yourName);
foreach(var at in notes)
{
MyAtrribute myAt = at as MyAtrribute;
Console.WriteLine(myAt.Note);
}
我们很容易发现这里有个问题,就是必须添加MyDll的引用.不然去哪找到类MyAtrribute啊.
那这样的话如果只是动态加载MyDll该咋整啊.那样就会比较麻烦了.
得这样
string dllPath = @"D:\MyDll.dll";
Assembly asm = Assembly.LoadFrom(dllPath);
Type myAtrribute = asm.GetType("MyDll.MyAtrribute");
MethodInfo myFunction = myAtrribute.GetMethod("ShowNote"); //先要得到特性类中的函数
Type yourName = asm.GetType("MyDll.YourName");
Attribute[] notes = Attribute.GetCustomAttributes(yourName);
foreach(var note in notes)
{
object myObject = (object) note;
myFunction.Invoke(myObject, null); //这里才能得到特性里的内容
}
这样用起来就很麻烦的.不知道有其他啥简单点的方法不.
分享到:
相关推荐
c#中的特性(attribute)+反射的一个例子
【内容概要】:在C#中使用反射获得Attribute(特性)的设定值。 【涉及的知识点】:自定义Attribute、C#中的反射知识 【使用人群】:初级工程师,适合刚开始学习的人群 【使用场景及目标】:学习如何使用反射获取...
07.C# 知识回顾 - 特性 Attribute.pdf 07.C# 知识回顾 - 特性 Attribute.pdf 07.C# 知识回顾 - 特性 Attribute.pdf
来自博客http://home.cnblogs.com/u/FourLeafCloverZc/的代码分享。 博客文章(C#基础--Attribute(标签) 和 reflect(反射) 应用)
C# 特性 Attribute
c#特性(Attribute)简单示例,适合初学者
C#反射特性 基础入门,对新手绝对有帮助。 其中得到小伙伴赵勇的指导和参照这篇文章: http://www.cnblogs.com/jyk/archive/2010/08/06/1793668.html
【内容概要】:在C#中通过学习使用Attribute,实现一个简单的ORM框架。里面主要有两部分的内容,学习使用Attribute获得设定值;学习通过反射获取属性的值 【适应人群】:初级工程师。但需要对反射、Attribute有一定...
基于如下的几个理由,需要为应用程序提供多个版本: 1:应用程序有体验版和完整功能版; 2:应用程序测试过程中需要完成一些自动化的操作;
C#的Attribute
预定义特性 AttributeUsage 描述了如何使用一个自定义特性类。它规定了特性可应用到的项目的类型
Attribute是C#的一种语言特性,用于为各种实体(class,field,property)附加一些说明性信息, 并且可以在运行时环境中检索这些信息(通过反射)。 所有的Attribute必须继承自Attribute类,按照约定,特性类的名称带...
D:\搜狗高速下载\2021-09-12
你是否对 c# attribute 感到不解,如在有一个类定义前加了一个[]是代表什么,这就是c# 的attribute ,这里有两个简单直观的实例,让你直观的、容易的理解attribute的用法,
日常工作中,需要为程序集提供统计分析: 1:程序集方法数; 2:开发人员数目及各自所开发或REVIEW的方法数; 3:测试中,被标注有BUG的数目; 4:直接查看方法的IL代码; 鉴于以上统计的需要,特开发本EXE。
在C#中有两个属性,分别为Property和Attribute,两个的中文意思都有特性、属性之间,但是用法上却不一样,为了区别,本文暂把Property称为特性,把Attribute称为属性。 Attribute才是本文的主角,把它称为属性我觉得...
该例子详细讲解了在.net编程中,如何在APP中使用反射与特性编程,保证简单易懂!
C#程序设计-3期(KC008) KC008110100015-C#中property与attribute的区别,他们各有什么用处,这种机制的好处在哪里.docx 学习资料 复习资料 教学资源
包含2篇attribute高级应用文章,以及相应的代码。 代码关键处,都有详细注释。 看过后,你会对attribute,context有更深刻的认识