1 反射获取程序集得三种方式
Assembly assembly = Assembly.Load("ReflexDemo"); //通过程序集得名称反射
Assembly a = Assembly.LoadFile(path); //通过程序集完整路径
Assembly assembly = Assembly.LoadFrom("Smalleight.dll"); //通过程序集及扩展名
1.1 完整路径两种方式
1.1.1通过需要反射的程序集的绝对路径+文件按名称及扩展名
Assembly assembly = Assembly.LoadFile("D:\\C#高级\\Programme\\Smalleight\\bin\\Debug\\net6.0\\Smalleight.dll"); //通过程序集的绝对路径
1.1.2 通过当前根目录下获取以引用的程序集
string path = AppDomain.CurrentDomain.BaseDirectory + "Smalleight.dll";
Assembly a = Assembly.LoadFile(path);
2 获取类型
Assembly assembly = Assembly.LoadFrom("Smalleight.dll"); //命名空间及文件扩展名
Type[] types = assembly.GetTypes(); //获取所有
Type type = assembly.GetType("Smalleight.test"); //获取指定参数命名空间.类的完全限定名
Type type = assembly.GetType("Smalleight.test"); //通过反射获取指定类
PropertyInfo[] properties= type.GetProperties(); //获取当前类下所有属性
FieldInfo[] fieldInfos= type.GetFields(); //获取当前类下所有字段
MethodInfo[] methods= type.GetMethods(); //获取当前类下所有方法
2.1 反射一个DLL中的类,并且没有引用
Assembly assembly = Assembly.LoadFrom("Smalleight.dll");
dynamic d = assembly.CreateInstance("Smalleight.test") //命名空间.类名
d.Username="小八";
如此就能使用到类中的属性及方法等,但是因为dynamic是动态获取,所以在使用的时候是无法直接智能提示.出来类中的属性,斌且也不会出现标红在你运行的时候才会出现报错,对此我们也可以使用多态来接收
2.2 通过多态获取类中属性及方法
创建一个类库并且新建一个接口类
public interface Itest
{
public string Username { get; set; }
public string xiaoba(string Username);
}
b. 继承接口类并实现
public class test : Itest
{
public string Username { get; set ; }
public string xiaoba(string Username)
{
return Username + "在吃饭";
}
}
c. 前台调用
Assembly assembly = Assembly.Load("Smalleight");
//dynamic d = assembly.CreateInstance("Smalleight.test");
Itest test = (Itest)assembly.CreateInstance("Smalleight.test");
test.Username = "小八";
var res= test.xiaoba(test.Username);
Console.WriteLine(res);
Console.ReadKey();
实现结果

3 通过反射将对象A的属性映射到对象B
public class Test
{
public void Main()
{
var classA = new A() { Name = "小八", Age = 18 };
var obj = Mapper<B>(classA);
}
public TOut Mapper<TOut>(object obj) where TOut : class, new()
{
//获取类型
Type outType = typeof(TOut);
//实例化泛型返回对象
TOut outObj = new TOut();
//获取类型
Type inType = obj.GetType();
//获取并遍历该类的所有属性
foreach (var item in inType.GetProperties())
outType.GetProperty(item.Name)?.SetValue(outObj, item.GetValue(obj));
return outObj;
}
}
public class A
{
public string Name { get; set; }
public int Age { get; set; }
public int Age2 { get; set; }
}
public class B
{
public string Name { get; set; }
public int Age { get; set; }
}