c#反射-从Type搜寻成员

除了Type可以描述类型的信息以外。
还有字段,属性,方法,构造器,事件等类型,用于描述各自的成员。

以下是示例类

abstract class Base
{
	public int Id;
	public string Name;
	public void SetId(byte b1, byte b2) { Id = b1 * b2; }
	public abstract void SetId(int i);
}
class Child : Base
{
	private int hp;
	public int Hp
	{
		get => hp; set
		{
			if (value > 0)
			{ hp += value; }
			else if (-value > Def)
			{ hp += value - Def; }
		}
	}
	public static int Atk { get; set; }
	private static int Def { get; set; }
	public override void SetId(int i) { Id = i; }
}

搜寻成员(成员是字段,方法,属性,事件的基类)

Type t1 = typeof(Child);
MemberInfo[] m1 = t1.GetMembers();//获取所有public成员。如果没找到那么数组长度为0而不是得到null
MemberInfo[] m2 = t1.GetMember("Id");//获取所有public并带有指定名字的成员。因为有方法重载,所以得到的是数组。


foreach (var item in m1)
{
	Console.WriteLine(item.Name);
}
Console.WriteLine("==============");
foreach (var item in m2)
{
	Console.WriteLine(item.Name);
}
Console.WriteLine("==============");
foreach (var item in m3)
{
	Console.WriteLine(item.Name);
}
get_Hp
set_Hp
get_Atk
set_Atk
SetId
SetId
GetType
ToString
Equals
GetHashCode
.ctor
Hp
Atk
Id
Name
==============
Id

配置搜索依据

所有的成员搜索方法,默认都只搜索public的成员。如果要改变这个查询方式,需要使用BindingFlags进行配置。
这是一个位枚举,所有所搜成员方法都有一个接收这个参数的重载。

MemberInfo[] m3 = t1.GetMembers(BindingFlags.Static | BindingFlags.NonPublic);//这里是静态非public
foreach (var item in m3)
{
	Console.WriteLine(item.Name);
}
get_Def
set_Def
Def
<Atk>k__BackingField
<Def>k__BackingField

需要注意的是,实例和静态,公开和不公开,这两对配置至少要提供一个。
如果不提供,不会认为包含这两个条件。一个都找不到。

搜寻字段和属性

FieldInfo f1 = t1.GetField("Id");//字段和属性不会重载,所以不会得到数组。
FieldInfo[] f2 = t1.GetFields();

PropertyInfo p1 = t1.GetProperty("Atk");//索引器和属性归为一类
PropertyInfo[] p2 = t1.GetProperties();//以y结尾的单词改复数,把y改i再加es

搜寻方法

MethodInfo me1 = t1.GetMethod("SetId", new Type[] { typeof(int) });//搜寻指定方法需要连同参数列表一起传入
MethodInfo[] me2 = t1.GetMethods();

ConstructorInfo[] c1 = t1.GetConstructors();//构造器被单独归为一类

其他成员

EventInfo[] e1 = t1.GetEvents();//获取事件
Type[] n1 = t1.GetNestedTypes();//获取嵌套类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值