您的位置:首页 > 编程语言 > C#

c#反射使用

2015-07-22 18:14 806 查看
使用ORM也有几个项目了,是利用反射原理实现的。大概知道反射是什么东西,也知道反射的作用和原理,自己却没有使用过,不知道如何使用?我也是醉了。

创建一个类库,编译生成dll程序集

namespace ReflectionClass
{
public class Student
{
private string _name;

private bool _isMonitor;

public string Name { get { return _name; } set { _name = value; } }

public bool IsMonitor { get { return _isMonitor; } set { _isMonitor = value; } }

//无参构造函数
public Student()
{
Name = "Constructor";
IsMonitor = false;
}

//有参数的构造函数
public Student(string name, bool isMonitor)
{
_name = name;
_isMonitor = isMonitor;
}

//无参数的方法
public string Hello()
{
if (_isMonitor)
{
return string.Format("Hello,My Name Is {0},Im Monitor", _name);
}
else
{
return string.Format("Hello,Im {0}", _name);
}
}
}
}



将程序集放到,需要反射项目的bin目录下,然后使用反射设置属性和使用方法
using System;
using System.Reflection;

namespace Reflection
{
class Program
{
static void Main(string[] args)
{
//获取程序集,LoadFile方法里面必须是物理路劲,Environment.CurrentDirectory返回的是bin\debug的绝对路径
Assembly assembly = Assembly.LoadFile(System.Environment.CurrentDirectory + "\\ReflectionClass.dll");
//获取Student类型
var type = assembly.GetType("ReflectionClass.Student");

object result = null;

#region 调用构造函数
#region 无参构造函数
//创建Student实例
var student1 = assembly.CreateInstance("ReflectionClass.Student");
//调用无参数的构造函数
var constructorInfo = type.GetConstructor(new Type[0]);
//这里可以不调用构造函数,因为实例化的时候已经默认调用了无参数的构造函数
if (constructorInfo != null) constructorInfo.Invoke(student1, null);
result = type.GetMethod("Hello").Invoke(student1, null);
Console.WriteLine(result);
#endregion

#region 有参数的构造函数
//创建Student实例
var student4 = assembly.CreateInstance("ReflectionClass.Student");
//调用有参数的构造函数,这里参数类型一定要和构造函数的参数对应,否者就会检索不到构造函数。如果检索不到,创建对象(实例化)的时候就会使用无参数的构造函数。
var constructorInfoPram = type.GetConstructor(new Type[2] {typeof (string), typeof (bool)});
//具体参数值写在Invoke的第二个参数里面new object[]{}
if (constructorInfoPram != null) constructorInfoPram.Invoke(student4, new object[] {"xiaowang", true});
//调用的方法如果是无参数的,Invoke的第二个方法为null,如果是有参数的使用new object[]{}添加参数值
result = type.GetMethod("Hello").Invoke(student4, null);
Console.WriteLine(result);
#endregion
#endregion

#region 单个设置属性,调用方法,构造函数
//创建Student实例
var student2 = assembly.CreateInstance("ReflectionClass.Student");
//设置Name和IsMonitor属性
type.GetProperty("Name").SetValue(student2, "wangqi", null);
type.GetProperty("IsMonitor").SetValue(student2, false, null);
//调用Hello方法
result = type.GetMethod("Hello").Invoke(student2, null);
Console.WriteLine(result);
#endregion

#region 遍历设置属性,调用方法
//创建Student实例
var student3 = assembly.CreateInstance("ReflectionClass.Student");
//获取所有属性,通过遍历设置属性值
PropertyInfo[] propertyInfos = type.GetProperties();
foreach (var info in propertyInfos)
{
switch (info.Name)
{
case "Name":
info.SetValue(student3, "tangmeng", null);
break;
case "IsMonitor":
info.SetValue(student3, true, null);
break;
}
}
//获取所有方法,通过遍历执行方法
MethodInfo[] methodInfos = type.GetMethods();
foreach (var methodInfo in methodInfos)
{
switch (methodInfo.Name)
{
case "Hello":
result = methodInfo.Invoke(student3, null);
break;
}
}
Console.WriteLine(result);
#endregion

Console.ReadLine();
}
}
}




执行结果截图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: