C#反射基础理解1(转)
反射提供了封装程序集、模块和类型的对象(Type类型)
可以使用反射动态的创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后,可以调用类型的方法或访问其字段和属性 。
总之,有了反射,以前很多实现不了的功能都可以实现。
下面先来写一个小例子,体验一下反射是怎么一回事:
打开VS2010,新建一个控制台应用程序,在program.cs里面写代码
首先引入命名空间:
using System.Reflection;
下如下代码:
PropertyInfo len = typeof(string).GetProperty("Length");
string s = "Hello,reflection!";
int length = (int)len.GetValue(s, null);
Console.WriteLine(length.ToString());
这里通过反射获取string的Length属性,并通过调用PropertyInfo 的GetValues方法获取属性值,其中GetValues方法的原型如下:
public virtual object GetValue(object obj, object[] index);
第一个参数obj是拥有此属性的类的实例,在这个例子中,为字符串s,s拥有Length属性。
第二个参数为索引值,微软解释如下:
Optional index values for indexed properties. This value should be null for non-indexed properties.
一般情况下用null,大家可以自己深入研究一下。
GetValues方法返回的是object类型,所以必须强制转换类型。
下面通过反射来获取string的一个方法,看看方法是如何通过反射得到的,代码如下:
string s = "Hello,reflection!";
MethodInfo method = typeof(string).GetMethod("Contains");
bool result = (bool)method.Invoke(s, new object[] { "Hello" });
Console.WriteLine(result);
其中,Invoke的方法定义如下:
public object Invoke(object obj, object[] parameters);
这个就很好理解了,第一个参数为拥有此方法的类的实例,还是为string实例s.
第二个参数就是一个object数组的参数。
这里调用的是string中的Contains方法,判断string中是否包含某个字符串。
下面通过反射来实例化一个string对象,代码如下:
Type t = Type.GetType("System.String");
char[] para = new char[] { 'H', 'e', 'l', 'l', 'o' };
var o = Activator.CreateInstance(t, para);
Console.WriteLine(o);
这个跟获取方法相似,唯一不同的就是string的构造方法参数是char[]数组,所以必须传入符合的类型。这里实例化了一个string,值为Hello。
看到这里,你对反射已经有了初步的了解,下面开始进入实战应用:
在解决方案上面点击鼠标右键,添加项目,选中类库,输入名称,添加一个类库。
在类库中添加Custom类,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ReflectionDll
{
public class Custom
{
public string Name { get; set; }
public string Address { get;set; }
public int Age { get; set; }
public DateTime BirthDay { get; set; } public string GetInfo(string name = "",int age = 0)
{
if (name == "" && age == 0)
{
return "Custom Name: " + this.Name + ",Age: " + this.Age;
}
else
{
return "Custom Name: " + name + ",Age: " + age;
}
}
}
}

这里只声明了几个属性和一个方法,供演示使用。写好后编译一下,在控制台项目里面添加引用这个类库(为了方便,否则每次编译都要手动拷贝DLL到控制台项目下面),这样VS会自动将生成的DLL拷贝到控制台debug目录下,方便调用。下面开始使用反射来加载这个DLL,代码如下:
string path = Environment.CurrentDirectory + "\\ReflectionDll.dll";
Assembly assem = Assembly.LoadFile(path);
Type customType = assem.GetType("ReflectionDll.Custom");
var custom = Activator.CreateInstance(customType);
注意了,这里首先要获取DLL的物理路径,所以上面是否添加引用是无所谓的。有了路径后,通过Assembly的LoadFile方法加载DLL,再获取类的Type,注意GetType方法里面的参数必须为类的全称,及命名空间 + 类名,否则无法找到。
最后一行,创建了一个类的实例,类型为object类型。
下面来获取Custom的所有属性,代码如下:

PropertyInfo[] propertys = customType.GetProperties();
Console.WriteLine("******************************");
foreach (PropertyInfo pro in propertys)
{
Console.WriteLine("PropertyName:" + pro.Name + "\n" +
"PropertyType:" + pro.PropertyType + "\n" +
"ClassName:" + pro.ReflectedType + "\n" +
"DLLName:" + pro.Module + "\n");
}
Console.WriteLine("******************************");

通过调用GetProperties方法获取所有属性,保存到PropertyInfo[]数组中,然后遍历数组输出属性值。
下面是各个属性的含义:
Name 属性名称
PropertyType 属性数据类型
ReflectedType 所在的类的命名控件 + 类名
Module 所在的DLL文件名称
设置某个属性的值,方法如下:
PropertyInfo p = customType.GetProperty("Name");
p.SetValue(custom, "CustomName",null);
是不是很容易啊。。。
下面来说一下,调用类的方法,和一些属性。代码如下:

MethodInfo _method = customType.GetMethod("GetInfo");
//显示方法名称
Console.WriteLine("Invoke method:" + _method.Name);
//显示返回的数据类型
Console.WriteLine("Return type:" + _method.ReturnParameter);
ParameterInfo[] parameters = _method.GetParameters();
foreach (ParameterInfo pa in parameters)
{
Console.WriteLine(pa.Name + pa.ParameterType + pa.Position + pa.Member);
}
object[] paras = new object[] { "Jack",24 };
Console.WriteLine(_method.Invoke(custom, paras));

同属性一样,参数可以通过GetParameters()来获取,获取的参数信息如下: Name 参数名称
ParameterType 参数数据类型
Position 参数的位置
Member 输出所有参数 调用有参数的方法时,需要传入参数,New一个object数组,将参数按顺序写入即可。
C#反射基础理解1(转)的更多相关文章
- java反射基础知识(四)反射应用实践
反射基础 p.s: 本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的Quick Start. 在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的 ...
- Java的反射基础技术
今天本人给大家讲解一下Java的反射基础技术,如有不对的或者讲的不好的可以多多提出,我会进行相应的更改,先提前感谢提出意见的各位了!!! 什么是反射? 反射它是根据字节码文件可以反射出类的信息.字段. ...
- java反射 之 反射基础
一.反射 反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...
- 【转】Java反射 之 反射基础
一.反射 反射:Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...
- C#委托零基础理解
C#委托零基础理解(转) 1, 为什么使用委托 2.什么是委托 3.委托如何使用 为什么使用委托? 委托是c#中非常重要的一个概念,使用委托使程序员可以将方法引用封装在委托对象内.然后可以将该委 ...
- Java Reflection 反射基础
反射基础: package reflection; /** * Created by : Infaraway * DATE : 2017/3/2 * Time : 23:06 * Funtion : ...
- java反射基础知识(一)
一.反射 反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...
- 机器学习:SVM(基础理解)
一.基础理解 1)简介 SVM(Support Vector Machine):支撑向量机,既可以解决分类问题,又可以解决回归问题: SVM 算法可分为:Hard Margin SVM.Soft Ma ...
- Java基础教程:反射基础
Java基础教程:反射基础 引入反射 反射是什么 能够动态分析类能力的程序称为反射. 反射是一种很强大且复杂的机制. Class类 在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时 ...
随机推荐
- jQuery(二):jQuery选择器
jQuery选择器类似于CSS选择器,用来选取网页中的元素.例如: $("h3").css("background-color","red" ...
- [hadoop读书笔记]前言
hadoop2.0+主要变化: 全新的MapReduce 2,它建立在一个新的分布式资源管理系统之上,该系统称之为YARN. YARN:分布式资源管理系统
- Chrome驱动安装问题
1.org.openqa.selenium.WebDriverException: unknown error: call function result missing 'value' 原因:浏览器 ...
- 2、TestNG+Maven+IDEA环境搭建
前言: 主要进行TestNG测试环境的搭建 所需环境: 1.IDEA UItimate 2.JDK 3.Maven 一.创建工程 File –>new –>Project–>next ...
- 【转】【Python】Python中的__init__.py与模块导入(from import 找不到模块的问题)
python中的Module是比较重要的概念.常见的情况是,事先写好一个.py文 件,在另一个文件中需要import时,将事先写好的.py文件拷贝 到当前目录,或者是在sys.path中增加事先写好的 ...
- python-迭代器与生成器的区别
这里涉及几个知识点:迭代器.生成器.yieId 先用个例子看一下迭代器与生成器的区别吧 #L是个list,迭代用for循环即可,L取出来是存放在内存中的,再多次去循环取出都可以>>> ...
- soapui-groovy脚本中文乱码及符号乱码、响应乱码解决方案
groovy脚本中文乱码及符号乱码,解决方案: 响应乱码解决方案:
- matlab中的常用的函数——在稀疏表示中学习到的
1, 矩阵的逆: inv()函数: 2. 矩阵的伪逆: pinv()函数: 3. 矩阵的克罗内克尔积: kron()函数: 4. 得到一个dct变换的字典: dctmtx()函数, 它可以得到一个 n ...
- JsonCpp 判断 value 中是否有某个KEY
JsonCpp如何判断是否有某个KEY,使用json[“key”]和isXXX的函数即可. 如果json中没有key键,则会创建一个空成员或者返回一个空成员. bool isNull() const; ...
- Java如何监视线程的状态?
在Java编程中,如何监视线程的状态? 以下示例演示如何通过扩展Thread类并使用currentThread.getName()方法来监视线程的状态. package com.yiibai; cla ...