学习--反射
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习--反射相关的知识,希望对你有一定的参考价值。
可以通过反射获取程序或程序集中的类、方法、特性。
1.反射的用途:
(1)使用Assembly加载程序集和定义,加载在程序集清单中获取所包含的模块,以及从此程序集中查找类型并创建该类型的实例。
(2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。
(3)使用ConstructorInfo了解构造函数的名称、参数、访问修饰符和实现详细信息。
(4)使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符和实现详细信息。
(5)使用FiedInfo了解字段的名称、访问修饰符和实现详细信息,并获取或设置字段值。
(6)使用EventInfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,添加或移除事件处理程序。
(7)使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。
(8)使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。
注:这部分总结引用博友:dodo,他总结的很好。
2.代码实例
2.1 反射加载dll,读取module、类、方法、特性
Assembly assembly = Assembly.Load("DB.SqlServer");
Console.WriteLine("---------GetModules------------");
foreach (var item in assembly.GetModules())
{
Console.WriteLine(item.FullyQualifiedName);
}
foreach (var item in assembly.GetTypes())
{
Console.WriteLine(item.FullName);
}
Type typeDbHelper = assembly.GetType("DB.SqlServer.DBHelper");
foreach (var item in typeDbHelper.GetConstructors())//构造函数
{
Console.WriteLine(item.Name); //ctor是构造函数的名称(输出)
}
Console.WriteLine("------属性-----");
foreach (var item in typeDbHelper.GetProperties())
{
Console.WriteLine(item.Name);
}
Console.WriteLine("------方法-----");
foreach (var item in typeDbHelper.GetMethods())
{
Console.WriteLine(item.Name);
}
Console.WriteLine("------属性-----");
foreach (var item in typeDbHelper.GetFields())
{
Console.WriteLine(item.Name);
}
2.2反射创建对象
Object objectType = Activator.CreateInstance(typeDbHelper);
IDBHelper dbHelperReflection = (IDBHelper)objectType;
dbHelperReflection.Add();
2.3反射调用实例方法
Console.WriteLine("**************反射调用实例方法****************");
{
MethodInfo methodInfo = typeDbHelper.GetMethod("Add");
methodInfo.Invoke(objectType, null);
}
{
MethodInfo method = typeDbHelper.GetMethod("Show1", new Type[] { typeof(string) });
method.Invoke(objectType, new object[] { "nike" });
}
{
MethodInfo method = typeDbHelper.GetMethod("Show2", new Type[] { typeof(int) });
method.Invoke(objectType, new object[] { 123 });
}
{
MethodInfo method = typeDbHelper.GetMethod("Show3", BindingFlags.Instance | BindingFlags.NonPublic);
method.Invoke(objectType, new object[] { "私有方法参数" });
}
{
MethodInfo method = typeDbHelper.GetMethod("ShowGeneric");
method=method.MakeGenericMethod(typeof(string));
method.Invoke(objectType, new object[] { "泛型" });
}
3.DBHelper类
public class DBHelper : IDBHelper
{
public string ID { get; set; }
public string Pname = null;
public bool Add()
{
return true;
}
public bool Delete()
{
return true;
}
public bool Update()
{
return true;
}
public void Query()
{
Console.Write("这是{0}的Query方法", this.GetType().FullName);
}
public void Show1(string str)
{
Console.WriteLine("参数为{0}", str);
}
public void Show2(int num)
{
Console.WriteLine("参数为Int,是{0}",num);
}
private void Show3(string str)
{
Console.WriteLine("这是私有方法,参数为{0}",str);
}
public void ShowGeneric<T>(string name)
{
Console.WriteLine("这是{0}的ShowGeneric,T={1},name={2}",this.GetType(),typeof(T),name);
}
}
注:刚刚学习,有错误的地方请大家给予指出,谢谢。
以上是关于学习--反射的主要内容,如果未能解决你的问题,请参考以下文章