反射就是在运行的时候发现对象的相关信息。根据这些信息可以动态的执行对象的方法以及获取对象的属性所储存的值。
1,首先我们先建立一个类库工程MyDll,并新建一个类ReflectTest
代码如下:
using System;

namespace MyDll


{

/**//// <summary>
/// ReflectTest 的摘要说明。
/// </summary>

//接口
public interface ITest

{
int add();
}

public class ReflectTest : ITest

{
public String Write;
private String Writec;

public int add()

{
return 10;
}

public String Writea

{

get
{ return Write;}

set
{ Write = value;}
}

private String Writeb

{

get
{ return Writec;}

set
{ Writec = value;}
}

//构造函数
public ReflectTest()

{
this.Write = "Write";
this.Writec = "Writec";
}

//有参构造函数
public ReflectTest(string str1,string str2)

{
this.Write = str1;
this.Writec = str2;
}

public string PrintString(string s)

{
return "这是一个实例方法" + s;
}

private string PrintString2()

{
return "这是一个私有方法";
}

public static string Print(string s)

{
return "这是一个静态方法," + s;
}
public string PrintNoPara()

{
return "您使用的是无参数方法";
}

public static string PrintData(string s)

{
return s;
}

public static string PrintData(string s1, string s2)

{
return s1+s2;
}


}
}

编译后得到MyDll.dll文件
2,应用反射


using System;
using System.Reflection;

namespace cmdText


{

/**//// <summary>
/// 说明:反射学习
/// 程序:寻梦E.net
/// </summary>
public class Reflect2

{

delegate string TestDelegate(string value1);

public static void Main(string[] args)

{
Assembly ass = null ;
Type type = null ;
object obj = null;

string assemblyName = "MyDll";
string className = "MyDll.ReflectTest";
try

{
//以下三种方法都可以
//ass = Assembly.LoadFile(System.Environment.CurrentDirectory+"/MyDll.dll");
//ass = Assembly.LoadFrom(System.Environment.CurrentDirectory+"/MyDll.dll");
ass = Assembly.Load(assemblyName);
}
catch

{
Console.Write("无法找到程序集!");
return;
}
//获取类型
type = ass.GetType(className);
//type = Type.GetType(className);//效果同上
//生成一个类实例,无参构造函数
obj = ass.CreateInstance(className);
//obj = Activator.CreateInstance(type);//效果同上

//**************************方法调用*************************************
//反射实例方法

Console.WriteLine("*******方法调用**************************************");
MethodInfo method = type.GetMethod("PrintString");

string s = (string)method.Invoke(obj,new string[]
{"寻梦E.net"});
Console.WriteLine(s);

//反射私有方法
method = type.GetMethod("PrintString2",BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
s = (string)method.Invoke(obj,null);
Console.WriteLine(s);

//反射静态方法
method = type.GetMethod("Print");

s = (string)method.Invoke(null,new string[]
{"寻梦E.net"});
Console.WriteLine(s);

//反射无参方法
method = type.GetMethod("PrintNoPara");
s = (string)method.Invoke(obj,null);
Console.WriteLine(s);

//反射重载了的静态方法

Type[] objParam =
{typeof(string),typeof(string)};
method = type.GetMethod("PrintData",objParam );

s = (string)method.Invoke(null,new object[]
{"hello!"," 寻梦E.net"});
Console.WriteLine(s);

Console.WriteLine("*******属性,域的赋值与访问***********************");


//*****************属性,域的赋值与访问***************************************
//公有属性
PropertyInfo pi1 = type.GetProperty("Writea");
pi1.SetValue(obj, "公有属性:Writea", null);
Console.WriteLine(pi1.GetValue(obj,null));

//私有属性
PropertyInfo pi2 = type.GetProperty("Writeb", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
pi2.SetValue(obj, "私有属性:Writeb", null);
Console.WriteLine(pi2.GetValue(obj, null));
//域
FieldInfo fi1 = type.GetField("Write");
Console.WriteLine(fi1.GetValue(obj));


Console.WriteLine("*******类型,模块,方法,构造函数等信息的获取*****");



//******************类型,模块,方法,构造函数等信息的获取******************************************
//有参构造函数实例化
//string[] classParams = {"lsm","sky"};
//object obj2 = Activator.CreateInstance(type,classParams);

foreach(Type t in ass.GetTypes())

{
Console.WriteLine("类型:"+t.Name );
}
foreach(Module m in ass.GetModules())

{
Console.WriteLine("模块:"+m.Name);
}

MethodInfo[] methods = type.GetMethods();
foreach (MethodInfo m in methods)

{
Console.WriteLine("方法"+m.Name); //显示所有的共有方法
}

FieldInfo[] fields = type.GetFields();
foreach (FieldInfo f in fields)

{
Console.WriteLine("字段信息:"+f.Name);
}

PropertyInfo[] propertys = type.GetProperties();
foreach( PropertyInfo p in propertys)

{
Console.WriteLine("属性:"+p.Name);
}

ConstructorInfo[] ci1 = type.GetConstructors();
foreach (ConstructorInfo ci in ci1)

{
Console.WriteLine("构造函数:"+ci.ToString()); //获得构造函数的形式
}

//*******************接口***************************************
Console.WriteLine("*******接口*****************************************");

MyDll.ITest obj1 = (MyDll.ITest)ass.CreateInstance(className);//这里必须是实现接口的类名,因为接口不能实例化
//MyDll.ReflectTest obj2= (MyDll.ReflectTest)ass.CreateInstance(className);
//典型的工厂模式
int i = obj1.add();
Console.WriteLine(i);


//*****************委托*******************************************

TestDelegate myDelegate = (TestDelegate)Delegate.CreateDelegate(typeof(TestDelegate), obj, "PrintString");
//动态创建委托的简单例子
Console.WriteLine(myDelegate(" 动态调用委托"));


//*****************获得解决方案的所有Assembly********************

Assembly[] assemblys = AppDomain.CurrentDomain.GetAssemblies();
//遍历显示每个Assembly的名字
foreach (object var in assemblys)

{
Console.WriteLine("所有的Assembly的名字:"+var.ToString());
}
Console.Read();



}


}
}
运行效果图如下:



【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)