反射
定义一个类,并且生成dll
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ClassLibrary1
{
public class Class1
{
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
public void SayHi()
{
Console.WriteLine("大家好1!");
}
public void AAA()
{
MyClass mc = new MyClass();
mc.BBB();
}
}
public interface IFlyable
{
void Fly();
}
public delegate void MyDelegate();
public enum Good
{
高,
富,
帅
}
internal class MyClass
{
internal void BBB()
{
Console.WriteLine("能看到吗》");
}
}
public class Person
{
public string Name
{
get;
set;
}
public int Age
{
get;
set;
}
public string Email
{
get;
set;
}
}
public class Chinese : Person, IZiWoXiuFu
{
//户口
public string HuKouSuoZaiDi
{
get;
set;
}
public void XiuFu()
{
Console.WriteLine("调用了XiuFu方法。");
}
}
public interface IZiWoXiuFu
{
void XiuFu();
}
public abstract class MyAbsClass
{
public abstract void SayHello();
}
public static class MyStaticClass
{
}
}
反射调用dll里面的方法
//1加载一个程序集
string path =@"C:\Users\zhouyong\Desktop\反射\反射\ClassLibrary1.dll";
Assembly asm = Assembly.LoadFile(path);
//2.获取Person类型
Type type = asm.GetType("ClassLibrary1.Class1");
//获得个方法
MethodInfo minfo = type.GetMethod("SayHi");
Console.WriteLine(minfo.Name);
//创建一个type类型的对象obj
object obj = Activator.CreateInstance(type);
//调用方法
minfo.Invoke(obj, null);
常用的一些反射方法练习
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace Type的一些应用
{
class Program
{
static void Main(string[] args)
{
string path = @"C:\Users\zhouyong\Desktop\日常软件\我的资料\programme\practice\反射\反射\ClassLibrary1.dll";
Assembly asm = Assembly.LoadFile(path);
//获取chinese类型的Type
Type chinese= asm.GetType("ClassLibrary1.Chinese");
//获取Person类型的Type
Type Person= asm.GetType("ClassLibrary1.Person");
//获取接口类型的Type
Type IZiWoXiuFu=asm.GetType("ClassLibrary1.IZiWoXiuFu");
//获取抽象类的Type
Type MyAbsClass =asm.GetType("ClassLibrary1.MyAbsClass");
//获取静态类MyStaticClass的Type
Type MyStaticClass= asm.GetType("ClassLibrary1.MyStaticClass");
//3.验证一下Person类型是不是Chinese类型的父类。
//验证是不是可以把typChinese类型的对象赋值给typPerson类型。
bool b= Person.IsAssignableFrom(chinese);//ture
//判断是否可以将chinese=的对象赋值给IZiWoXiuFu接口类型
bool z = IZiWoXiuFu.IsAssignableFrom(chinese);//ture
Console.WriteLine(z);
////创建了一个Chinese类型的对象obj
object obj= Activator.CreateInstance(chinese);
MethodInfo xiufu =chinese.GetMethod("XiuFu");
//调用方法
xiufu.Invoke(obj, null);
//验证obj是不是Chinese类型的对象
bool a = chinese.IsInstanceOfType(obj);//ture
Console.WriteLine(a);
bool a1 = Person.IsInstanceOfType(obj);//ture
Console.WriteLine(a1);
////验证Chinese是否是Person的子类
bool a3 = chinese.IsSubclassOf(Person);//true
//IsSubclassOf不考虑接口,只考虑父子类关系。
bool a4=chinese.IsSubclassOf(IZiWoXiuFu);//false
Console.WriteLine(a3);
Console.WriteLine(a4);
Console.WriteLine(MyAbsClass.IsAbstract); //true
Console.WriteLine(MyStaticClass.IsAbstract);
//接口、抽象类、静态类都不能被实例化,所以这里都认为是“抽象的”
Console.ReadKey();
}
}
}