C# - 反射核心Type类常用方法 137
反射中Assembly类基本只在加载程序集中应用一次,而获取程序集中的类型,方法,属性等等都需要通过Type类的方法进行操作
1 获取Type的类型
假设有一个Person类,可通过以下方式获取其type类型
class Program
{
static void Main(string[] args)
{
//获取Person类型Type的方式
//1.通过对象调用GetType()方法
Person p = new Person();
Type type = p.GetType();
//2.通过typeof关键字
Type type1 = typeof(Person);
//3.通过程序集对象的GetType()方法
Assembly asm = Assembly.LoadFile(@"d:\ClsLib.dll");
//方法参数: 命名空间.类型名
Type typs = asm.GetType("ClsLib.Person");
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public void Say()
{
Console.WriteLine("获取type类型");
}
}
将要用于反射的类库代码
namespace ClsLib
{
public class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
public int Age { get; set; }
public void Say()
{
Console.WriteLine("获取type类型");
}
private void SayHi()
{
Console.WriteLine("通过反射调用了Person类私有方法");
}
}
//接口
public interface IFlyable
{
void Fly();
}
//继承父类与实现接口
public class Chinese : Person, IFlyable
{
public string CID { get; set; }
#region IFlyable 成员
public void Fly()
{
Console.WriteLine("翼装飞行");
}
#endregion
}
//抽象类
public abstract class MyAbsClass
{
//抽象方法
public abstract void SayHello();
}
//静态类
public static class MyStaticClass
{ }
}
2 通过Type类的方法验证是否存在继承关系,是否为指定对象,是否为指定类型的子类,是否为抽象类;通过反射调用私有方法
class Program
{
static void Main(string[] args)
{
//1.动态加载程序集
Assembly asm = Assembly.LoadFile(@"d:\ClsLib.dll");
//2.1获取Chinese类型的Type
Type typChinese = asm.GetType("ClsLib.Chinese");
//2.2获取Person类型的Type
Type typPerson = asm.GetType("ClsLib.Person");
//2.3获取接口类型的Type
Type typFly = asm.GetType("ClsLib.IFlyable");
//2.4获取抽象类MyAbsClass的Type
Type typMyAbsClass = asm.GetType("ClsLib.MyAbsClass");
//2.5获取静态类MyStaticClass的Type
Type typMyStaticClass = asm.GetType("ClsLib.MyStaticClass");
#region 验证是否存在继承关系
Console.WriteLine("验证是否存在继承关系");
//验证是不是可以把typChinese类型的对象赋值给typPerson类型。
bool b1 = typPerson.IsAssignableFrom(typChinese);
//true,因为Chinese继承了Person
Console.WriteLine(b1);
//判断是否可以将typChinese的对象赋值给typFly类型
bool b2 = typFly.IsAssignableFrom(typChinese);
Console.WriteLine(b2);
#endregion
#region IsInstanceOfType 验证是否为指定对象类型
Console.WriteLine("验证是否为指定对象类型");
//创建了一个typChinese类型的对象obj
object obj = Activator.CreateInstance(typChinese);
//验证obj是不是typChinese类型的对象
bool b3 = typChinese.IsInstanceOfType(obj);
Console.WriteLine(b3);//true
//验证obj是不是typPerson类型的对象
bool b4 = typPerson.IsInstanceOfType(obj);
Console.WriteLine(b4);//true
#endregion
#region IsSubclassOf 验证是否为指定类型的子类
Console.WriteLine("验证是否为指定类型的子类");
//验证typChinese是否是typPerson的子类
bool b5 = typChinese.IsSubclassOf(typPerson);
Console.WriteLine(b4);
//判断typChinese是否是typFly的子类
//IsSubclassOf不考虑接口(存在是否实现)
//只考虑父子类关系
bool b6 = typChinese.IsSubclassOf(typFly);
Console.WriteLine(b6);
#endregion
#region IsAbstract,判断某个类型是否是一个抽象的
Console.WriteLine("判断某个类型是否是一个抽象的");
Console.WriteLine(typChinese.IsAbstract);//false
Console.WriteLine(typPerson.IsAbstract);//false
//接口、抽象类、静态类都不能被实例化
//所以这里都认为是 抽象的 都是true
Console.WriteLine(typFly.IsAbstract);
Console.WriteLine(typMyAbsClass.IsAbstract);
Console.WriteLine(typMyStaticClass.IsAbstract);
#endregion
#region 通过反射调用类的私有成员
Console.WriteLine("调用私有方法");
Type tpPerson = asm.GetType("ClsLib.Person");
// 包含 非公有 实例成员
MethodInfo mi = tpPerson.GetMethod("SayHi", BindingFlags.NonPublic | BindingFlags.Instance);
object ob = Activator.CreateInstance(tpPerson);
//调用私有方法
mi.Invoke(ob, null);
#endregion
Console.ReadKey();
}
相关文章
- 电脑键盘指法+常用快捷键文字及图片详解
- 机械键盘灯亮按键无反应(机械键盘灯亮按键无反应什么原因)
- Keychron Q14 Max键盘开售:小键盘左置、Alice配列,1298元起
- Keychron K15 Max矮轴机械键盘开售:75%Alice配列,567元起
- 单手35键设计,Keychron旗下Lemokey推出X0机械键盘
- 线上故障排查全套路盘点,运维大哥请自查
- 学习Pandas中操作Excel,看这一篇文章就够了
- 对不起,我把APP也给爬了(对不起我把你弄脏)
- Navigating global shifts and forging a path for emerging economies
- 多目标追踪小抄:快速了解MOT的基本概念