菜的像徐坤
排名
7
文章
192
粉丝
15
评论
16
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

反射入门基础

5456人阅读 2021/3/31 19:59 总访问:960225 评论:3 收藏:0 手机
分类: Csharp

反射可以根据字符串创建对象(类全名,类库名)
反射可以访问属性,而且可以访问私有属性,并且给属性赋值
反射可以访问字段,而且可以访问私有字段,并且给字段赋值
反射可以调用方法,而且可以调用私有方法

存在一个类

  1.    public class TableInfo
  2.     {
  3.         public int Sid { getset; }
  4.         public string UserName { getset; }
  5.         public int? Sum { getset; }
  6.         public int? Max { getset; }
  7.         public int? Min { getset; }
  8.         public double Avg { getset; }
  9.         public string Father { getset; }
  10.         public string Mather { getset; }
  11.      }

通过反射拿到属性(typeof或者GetType)

  1.            //反射根据字段拿到属性
  2.             var type = typeof(TableInfo).GetProperty("Sum");
  3.             
  4.             TableInfo tableinfo = new TableInfo();
  5.             var type = tableinfo.GetType().GetProperty("Sum");

通过反射调用方法

  1.            //TableInfo中存在AA方法
  2.             public void AA()
  3.         {
  4.             Console.WriteLine("aa");
  5.         }

getMethod第一个参数是方法名,第二个参数是该方法的参数类型
因为存在同方法名不同参数这种情况,所以只有同时指定方法名和参数类型才能唯一确定一个方法
Invoke第一个参数是对象名,第二个的方法的参数 如果有参数则需要传递一个object集合     new object[] {"Hello"}

  1. //实例化对象
  2. TableInfo tableinfo = new TableInfo();
  3. typeof(TableInfo).GetMethod("AA").Invoke(tableinfo, null);

反射调用私有方法

可以使用下列 BindingFlags 调用标志表示要对成员采取的操作:

CreateInstance,表示调用构造函数。忽略 name。对其他调用标志无效。
InvokeMethod,表示调用方法,而不调用构造函数或类型初始值设定项。对 SetField 或 SetProperty 无效。
GetField,表示获取字段值。对 SetField 无效。
SetField,表示设置字段值。对 GetField 无效。
GetProperty,表示获取属性。对 SetProperty 无效。
SetProperty 表示设置属性。对 GetProperty 无效。
BindingFlags.Instance                     : 对象实例
BindingFlags.Static                          : 静态成员 
BindingFlags.Public                         : 指可在搜索中包含公共成员
BindingFlags.NonPublic                 : 指可在搜索中包含非公共成员(即私有成员和受保护的成员)
BindingFlags.FlattenHierarchy      : 指可包含层次结构上的静态成员
BindingFlags.IgnoreCase               : 表示忽略 name 的大小写
BindingFlags.DeclaredOnly           : 仅搜索 Type 上声明的成员,而不搜索被简单继承的成员
BindingFlags.CreateInstance        : 表示调用构造函数。忽略 name。对其他调用标志无效

  1. //TableInfo中存在DD方法
  2. private void DD()
  3.         {
  4.             Console.WriteLine("私有方法被调用");
  5.         }

调用

  1. //实例化对象
  2. TableInfo tableinfo = new TableInfo();
  3. //私有方法BindingFlags.NonPublic|BindingFlags.Instance 
  4. typeof(TableInfo).GetMethod("DD",System.Reflection.BindingFlags.NonPublic|System.Reflection.BindingFlags.Instance).Invoke(tableinfo, null);

反射调用泛型方法

  1.  //TableInfo中存在BB方法
  2.  public void BB<T>()
  3.         {
  4.             Console.WriteLine("泛型方法被调用");
  5.         }

调用

  1. //实例化对象
  2. TableInfo tableinfo = new TableInfo();
  3. //通过字段拿到属性
  4. var type = typeof(TableInfo).GetProperty("Sum");
  5. //通过属性传递方法名
  6. var FunB =  typeof(TableInfo).GetMethod("BB");
  7. //指定泛型类型(有返回值)
  8. FunB = FunB.MakeGenericMethod(type.PropertyType);
  9. //调用方法
  10. FunB.Invoke(tableinfo, null);


评价

尘叶心繁

2021/4/7 15:36:09

[给力]

剑轩

2021/4/9 10:39:48

点赞[威武]

平凡程序员

2021/4/27 12:24:23

[赞]