C#反射及简单应用

1 反射获取程序集得三种方式

  1. Assembly assembly = Assembly.Load("ReflexDemo"); //通过程序集得名称反射

  1. Assembly a = Assembly.LoadFile(path); //通过程序集完整路径

  1. 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 通过多态获取类中属性及方法

  1. 创建一个类库并且新建一个接口类

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; }
}

猜你喜欢

转载自blog.csdn.net/weixin_51326081/article/details/128959603