除了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();//获取嵌套类