反射
- 反射就是一个操作metadata元数据的一个类库(可以把反射当做一个小工具来读取或者操作元数据的,类,方法,属性,特性,字段)
- 使用场合
asp.net MVC,ORM, LOC几乎所有框架都会用到反射
1.更新程序时,自己更新dll
2.使用别人的dll文件
反射获取类信息(命名空间,全名)
{
class Program
{
static void Main(string[] args)
{
//方法一:通过typeod操作符
Type T1 = typeof(Person);
//方法二:通过类型的实例
Type T2 = new Person().GetType();
//方法三:通过静态方法
Type T3 = Type.GetType("System.IO.Stream");
Console.WriteLine("命名空间名称:" + T1.Namespace);
Console.WriteLine("直接基类型:" + T1.BaseType);
Console.WriteLine("全名:" + T1.FullName);
Console.WriteLine("是抽象类型:" + T1.IsAbstract);
Console.WriteLine("是否是类:" + T1.IsClass);
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public void sayHello()
{
Console.WriteLine($"My name is{this.Name}");
}
}
}
}
>>>
命名空间名称:test2
直接基类型:System.Object
全名:test2.Program+Person
是抽象类型:False
是否是类:True
获取类成员信息(方法,属性)
static void Main(string[] args)
{
Person p1 = new Person();
p1.Name = "Fxx";
p1.Age = 10;
Type T1 = typeof(Person);
var Mets = T1.GetMembers();
foreach (var item in Mets)
{
Console.WriteLine("【" + item.MemberType.ToString() + "】:" + item.Name);
}
}
>>>
【Method】:get_Name
【Method】:set_Name
【Method】:get_Age
【Method】:set_Age
【Method】:sayHello
【Method】:GetType
【Method】:ToString
【Method】:Equals
【Method】:GetHashCode
【Constructor】:.ctor
【Property】:Name
【Property】:Age
动态调用方法
-方法一:
namespace test2
{
class Program
{
static void Main(string[] args)
{
//有参数调用
Type T1 = typeof(TClass);
T1.InvokeMember("fun", BindingFlags.InvokeMethod, null, new TClass(), new string[] { "我是参数" });
//无参数调用
Type T2 = typeof(TClass);
T2.InvokeMember("fun2", BindingFlags.InvokeMethod, null, new TClass(), null);
//调用静态方法
Type T3 = typeof(TClass);
T3.InvokeMember("fun3", BindingFlags.InvokeMethod, null, T3, null);
}
public class TClass
{
public void fun(string str)
{
Console.WriteLine("我是fun有参方法,我被调用了。" + str);
}
public void fun2()
{
Console.WriteLine("我是fun2无参方法,我被调用了。");
}
public static void fun3()
{
Console.WriteLine("我是fun3静态方法,我被调用了");
}
}
}
}
>>>
我是fun有参方法,我被调用了。我是参数
我是fun2无参方法,我被调用了。
我是fun3静态方法,我被调用了
- 方法二:
static void Main(string[] args)
{
Type T1 = typeof(TClass);
T1.GetMethod("fun", BindingFlags.Instance | BindingFlags.Public).Invoke(new TClass(), new string[] { "testfun1" });
T1.GetMethod("fun2", BindingFlags.Instance | BindingFlags.Public).Invoke(new TClass(), null);
T1.GetMethod("fun3", BindingFlags.Static | BindingFlags.Public).Invoke(T1, null);
}
程序集
image.pngnamespace test2
{
class Program
{
static void Main(string[] args)
{
try
{
//加载方式一:dll文件名
//Assembly assembly = Assembly.Load("test2");
//加载方法二:完整路径名称
// Assembly assembly = Assembly.LoadFile(@"E:\myFirstC\ConsoleApp2\test2\bin\Debug\net5.0\test2.dll");
//加载方法三(推荐)
Assembly assembly = Assembly.LoadFrom("test2.dll");
foreach (var type in assembly.GetTypes())
{
Console.WriteLine(type.Name);
foreach (var method in type.GetMethods())
{
Console.WriteLine("这是"+method.Name+"方法")
}
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}
>>>
这是GetType方法
这是ToString方法
这是Equals方法
这是GetHashCode方法
Person1
这是sayHello方法
这是sayAge方法
这是GetType方法
这是ToString方法
这是Equals方法
这是GetHashCode方法
Person2
这是sayHello方法
这是sayAge方法
这是GetType方法
这是ToString方法
这是Equals方法
这是GetHashCode方法
网友评论