using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//注意添加该反射的命名空间
using System.Reflection;
namespace ReflectionProj
{
public class CReflection
{
//反射实例化对象并调用其方法,属性和事件的反射调用略去
public void UseReflection()
{
//加载程序集
Assembly tmpAss = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory +
@"..\..\..\refDlls\ReflectionProj.dll");
//遍历程序集内所有的类型,并实例化
Type[] tmpTypes =
tmpAss.GetTypes();
foreach (Type tmpType
in tmpTypes)
{
if (tmpType.FullName ==
"ReflectionProj.CReflection")
//防止死循环因为实在ReflectionProj工程内部调用自身的ReflectionProj.dll,一般都是在其他工程中
{
return;
}
//获取第一个类型的构造函数信息
ConstructorInfo[] tmpConsInfos =
tmpType.GetConstructors();
foreach (ConstructorInfo tmpConsInfo
in tmpConsInfos)
{
//为构造函数生成调用的参数集合
ParameterInfo[] tmpParamInfos =
tmpConsInfo.GetParameters();
object[] tmpParams =
new object[tmpParamInfos.Length];
for (
int i =
0; i < tmpParamInfos.Length; i++
)
{
tmpParams[i] =
tmpAss.CreateInstance(tmpParamInfos[i].ParameterType.FullName);
if (tmpParamInfos[i].ParameterType.FullName ==
"System.String")
{
tmpParams[i] =
"Clark";
}
}
//实例化对象
object tmpObj =
tmpConsInfo.Invoke(tmpParams);
Console.WriteLine(tmpObj);
//获取所有方法并执行
foreach (MethodInfo tmpMethod
in tmpType.GetMethods())
{
//为方法的调用创建参数集合
tmpParamInfos =
tmpMethod.GetParameters();
tmpParams =
new object[tmpParamInfos.Length];
for (
int i =
0; i < tmpParamInfos.Length; i++
)
{
tmpParams[i] =
tmpAss.CreateInstance(tmpParamInfos[i].ParameterType.FullName);
if (tmpParamInfos[i].ParameterType.FullName ==
"System.String")
{
tmpParams[i] =
"Clark Zheng";
}
if (tmpParamInfos[i].ParameterType.FullName ==
"System.Int32")
{
tmpParams[i] =
27;
}
}
tmpMethod.Invoke(tmpObj, tmpParams);
}
//调用完方法后再次打印对象,比较结果
Console.WriteLine(tmpObj);
}
}
Console.ReadLine();
}
}
/*
*
*25.什么是反射?
答:
反射,Reflection,通过它我们可以在运行时获得各种信息,如程序集、模块、类型、字段、属性、方法和事件
通过对类型动态实例化后,还可以对其执行操作
一般用于插件式框架程序和设计模式的实现,当然反射是一种手段可以充分发挥其能量来完成你想做的任何事情
(前面好象见过一位高人用反射调用一个官方类库中未说明的函数。。。)
*
*
*
*/
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ReflectionProj
{
public class CPerson
{
private string name;
private int age;
//如果显式的声明了无参数构造函数,客户端只需要用程序集的CreateInstance即可实例化该类
//在此特意不实现,以便在客户调用端体现构造函数的反射实现
//public CReflection()
//{
//}
public CPerson(
string Name,
int Age)
{
name =
Name;
age =
Age;
}
public void ChangeName(
string NewName)
{
name =
NewName;
}
public void ChangeAge(
int NewAge)
{
age =
NewAge;
}
public override string ToString()
{
return string.Format(
"Name: {0}, Age: {1}", name, age);
}
}
}
转载于:https://www.cnblogs.com/shenchao/p/4223184.html
相关资源:C#中通过反射操作泛型