反射优缺点
优点:动态
缺点:
1、避开编译器检查,在有错误的情况下,在编译的时候不会报错,只有运行的时候才会报错
2、用起来不只管,不方便
3、性能有损失
调用实例方法
创建一个实例方法
namespace DoSomeThing
{
public class Funtions
{
public void ShiLi()
{
Console.WriteLine("调用了一个实例方法");
}
}
}
调用
Console.WriteLine("**************调用实例方法*****************");
Assembly assembly = Assembly.Load("DoSomeThing");
Type type = assembly.GetType("DoSomeThing.Funtions");
Object obj = Activator.CreateInstance(type);
MethodInfo method = type.GetMethod("ShiLi");
method.Invoke(obj,null);
结果
调用有参数的实例方法
创建一个有参数的实例方法
namespace DoSomeThing
{
public class Funtions
{
public void ShiLi(string name,int id)
{
Console.WriteLine("调用了一个实例方法,并传递参数name={0},id={1}",name,id);
}
}
}
调用
Console.WriteLine("**************调用有参数的实例方法*****************");
//引用dll
Assembly assembly = Assembly.Load("DoSomeThing");
//获取类型
Type type = assembly.GetType("DoSomeThing.Funtions");
//创建对象
Object obj = Activator.CreateInstance(type);
//获取方法
MethodInfo method=type.GetMethod("ShiLi");
//执行方法 注意 这里传入的参数 类型和顺序要正确
method.Invoke(obj, new object[] { "黑猫警长",1});
结果
调用静态方法
创建一个静态方法
namespace DoSomeThing
{
public class Funtions
{
public static void ShiLi(string name,int id)
{
Console.WriteLine("调用了一个静态实例方法,并传递参数name={0},id={1}",name,id);
}
}
}
调用
Console.WriteLine("**************调用静态方法*****************");
//调用dll
Assembly assembly = Assembly.Load("DoSomeThing");
//获取类型
Type type = assembly.GetType("DoSomeThing.Funtions");
//获取方法
MethodInfo method = type.GetMethod("ShiLi");
//因为静态方法调用 不需要创建对象 所以前面传入null
method.Invoke(null,new object[]{"静态方法",22});
结果
重载方法的调用
重载方法
namespace DoSomeThing
{
public class ChongZai
{
public void Say()
{
Console.WriteLine("大家好");
}
public void Say(string name)
{
Console.WriteLine("大家好,我是{0}",name);
}
public void Say(int id)
{
Console.WriteLine("大家好,我是{0}号选手",id);
}
public void Say(string name,int id)
{
Console.WriteLine("大家好我是{0}号选手,我的名字是:{1}",id,name);
}
}
}
调用
Console.WriteLine("**************重载方法的调用*****************");
//读取dll
Assembly assembly = Assembly.Load("DoSomeThing");
//获取类型
Type type = assembly.GetType("DoSomeThing.ChongZai");
//创建对象
Object obj = Activator.CreateInstance(type);
//创建方法
MethodInfo method = type.GetMethod("Say",new Type[]{});
//调用
Console.WriteLine("调用0参数方法");
method.Invoke(obj, null);
Console.WriteLine("调用1-String参数方法");
MethodInfo method1 = type.GetMethod("Say",new Type[]{typeof(string)});
method1.Invoke(obj, new object[] { "卡卡西" });
Console.WriteLine("调用1-Int参数方法");
MethodInfo method2 = type.GetMethod("Say",new Type[]{typeof(int)});
method2.Invoke(obj, new object[] { 11 });
MethodInfo method3 = type.GetMethod("Say",new Type[]{typeof(string),typeof(int)});
Console.WriteLine("调用2参数方法");
method3.Invoke(obj, new object[] { "卡卡西", 11 });
调用私有方法
创建一个私有方法
namespace DoSomeThing
{
public class PrivateClass
{
private void GetPrivate()
{
Console.WriteLine("这是一个私有方法");
}
}
}
调用
Console.WriteLine("**************私有方法的调用*****************");
//引用dll
Assembly assembly = Assembly.Load("DoSomeThing");
//获取类型
Type type = assembly.GetType("DoSomeThing.PrivateClass");
//创建对象
Object obj = Activator.CreateInstance(type);
//获取私有方法
MethodInfo method = type.GetMethod("GetPrivate", BindingFlags.Instance | BindingFlags.NonPublic);
method.Invoke(obj,null);
结果
泛型方法
泛型类
namespace DoSomeThing
{
public class GenericClass
{
public void GenericFun<T>(T t)
{
Console.WriteLine("泛型参数类型是:{0},参数值为:{1}",typeof(T),t);
}
}
}
调用
Console.WriteLine("**************泛型方法的调用*****************");
//调用dll
Assembly assembly = Assembly.Load("DoSomeThing");
//获取类型
Type type = assembly.GetType("DoSomeThing.GenericClass");
//创建对象
Object obj = Activator.CreateInstance(type);
//获取方法
MethodInfo method = type.GetMethod("GenericFun");
method = method.MakeGenericMethod(typeof(string));
method.Invoke(obj,new object[]{"姓名"});
结果
需要注意的是,泛型方法和泛型类不一样 它不需要写 `N (图片中应该是泛型方法的调用,后来代码里面改了 结果图片就不换了 莫纠结)
获取属性和字段
类
namespace DoSomeThing
{
public class People
{
public string _Value;
private int _Age;
public int Id { get; set; }
private string Name { get; set; }
}
}
调用
Console.WriteLine("**************属性和字段的获取*****************");
//调用dll
Assembly assembly = Assembly.Load("DoSomeThing");
//获取类型
Type type = assembly.GetType("DoSomeThing.People");
//获取字段
foreach (var item in type.GetFields(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic))
{
Console.WriteLine(item.Name);
}
//获取属性
foreach (var item in type.GetProperties(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic))
{
Console.WriteLine(item.Name);
}
结果:
BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic
这段代码
字段的查询+赋值+读取
Console.WriteLine("**************字段的获取+赋值+读取*****************");
//调用dll
Assembly assembly = Assembly.Load("DoSomeThing");
//获取类型
Type type = assembly.GetType("DoSomeThing.People");
//创建对象
Object obj = Activator.CreateInstance(type);
//查询字段并赋值
foreach (var file in type.GetFields(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic))
{
if (file.Name.Equals("_Age"))
{
file.SetValue(obj,11);
}
else if (file.Name.Equals("_Value"))
{
file.SetValue(obj,"奥特曼");
}
}
//读取
foreach (var file in type.GetFields(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic))
{
Console.WriteLine(file.GetValue(obj));
}
属性的查询+赋值+读取
Console.WriteLine("**************属性的获取+赋值+读取*****************");
//调用dll
Assembly assembly = Assembly.Load("DoSomeThing");
//获取类型
Type type = assembly.GetType("DoSomeThing.People");
//创建对象
Object obj = Activator.CreateInstance(type);
//获取并赋值
foreach (var prop in type.GetProperties(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic))
{
if (prop.Name.Equals("Id"))
{
prop.SetValue(obj, 11, null);
}
else if (prop.Name.Equals("Name"))
{
prop.SetValue(obj, "奥特曼",null);
}
}
foreach (var prop in type.GetProperties(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic))
{
Console.WriteLine(prop.GetValue(obj,null));
}