3反射基本使用二(不加载程序集)

反射基本使用

反射使用基本就是两个方面使用:
要么就是通过一个类来当作反射类型Type,然后根据Type的方法拿到类里面的成员。
要么就是直接用一个类的实例对象当作反射类型Type,然后根据Type的方法拿到里面的成员。
但是,调用该类的方法的话,就必须要用一个该类的实例来调用了,可以通过反射创建该类的实例,然后进行调用。

使用

假如有一个类的实例
UserInfo user = new UserInfo();

用反射拿到指定属性和设置属性值

1、根据类的类型来访问属性类型

Type type = typeof(UserInfo).GetProperty("SubCount");

2、根据该类的实例来获取该实例的属性

var prop = user.GetType().GetProperty("SubCount");

如果要获得属性的类型,在后面加PropertyType属性即可,如:
var prop2 = user.GetType().GetProperty("SubCount").PropertyType;



用反射获取类的指定方法并且调用

1、通过对象实例获取对象的方法

私有方法在GetMethod第一个参数后面加 BindingFlags.NonPublic | BindingFlags.Instance
var method= user.GetType().GetMethod("Hello");
调用
user.GetType().GetMethod("Hello").Invoke(new UserInfo(), null);
Invoke里的参数:第一个参数,该对象的实例(必要),第二个参数:对象里的方法的参数,有的话格式如下:new object[] { "张三" },没有的话就写null

2、通过类的类型获取方法

Type type = typeof(UserInfo);
var method = type.GetMethod("Hello");

调用

 object user1 = Activator.CreateInstance(type);//创建一个UserInfo实例

PropertyInfo prop = type.GetProperty("UserName");//获取指定属性
//SetValue();第一个参数,要设置该属性的对象实例,第二个参数,值
prop.SetValue(user1,"李四"); //设置属性值,读取指定对象的属性值用getvalue

method.Invoke(user1, null);//用创建的实例调用

用反射获取泛型方法并且调用泛型方法

  Type type = typeof(UserInfo);
            PropertyInfo prop = type.GetProperty("UserName");//获取指定属性
			
            var method = typeof(UserInfo).GetMethod("Test");

            //给泛型类型
            method = method.MakeGenericMethod(prop.PropertyType);

            //调用
            method.Invoke(new UserInfo(), null);
posted @ 2021-11-01 15:29  青仙  阅读(41)  评论(0编辑  收藏  举报