学习--反射

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);
}
}

注:刚刚学习,有错误的地方请大家给予指出,谢谢。

以上是关于学习--反射的主要内容,如果未能解决你的问题,请参考以下文章

Java 反射学习笔记

Java反射学习

Java反射学习

Python学习————反射

反射学习

反射学习--------利用反射调用方法