C#反射调用dll文件中的方法操作泛型与属性字段

 更新时间:2022年05月04日 16:16:45   作者:農碼一生  
这篇文章介绍了C#反射调用dll文件中的方法操作泛型与属性字段,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、使用方法

  • 查找DLL文件,

  • 通过Reflection反射类库里的各种方法来操作dll文件

二、步骤

加载DLL文件

Assembly assembly1 = Assembly.Load("SqlServerDB");//方式一:这个DLL文件要在启动项目下
string filePath = Environment.CurrentDirectory + "";
Assembly assembly2 = Assembly.LoadFile(filePath + @"\SqlServerDB.dll");//方式二:完整路径
Assembly assembly3 = Assembly.LoadFrom(filePath + @"\SqlServerDB.dll");//方式三:完整路径
Assembly assembly4 = Assembly.LoadFrom(@"SqlServerDB.dll");//方式三:完整路径

获取指定类型

foreach (var item in assembly4.GetTypes())//查找所有的类型,就是有多少个类
{
    Console.WriteLine(item.Name);
}

获取构造函数

Type type = assembly4.GetType("SqlServerDB.ReflectionTest");//在ReflectionTest类中调用
foreach (var ctor in type.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
{
    Console.WriteLine($"构造方法:{ctor.Name}");
    foreach (var param in ctor.GetParameters())
    {
        Console.WriteLine($"构造方法的参数:{param.ParameterType}");
    }
}
//【3】实例化
//ReflectionTest reflectionTest = new ReflectionTest();//这种实例化是知道具体类型--静态

//object objTest = Activator.CreateInstance(type);//动态实例化--调用我们的构造方法
object objTest1 = Activator.CreateInstance(type, new object[] { "string" });//动态实例化--调用我们的有参数构造方法

//调用私有构造函数
//ReflectionTest reflectionTest = new ReflectionTest();  //普通调用
object objTest2 = Activator.CreateInstance(type, true);

调用非构造方法

object objTest2 = Activator.CreateInstance(type, true);
//调用普通方法
ReflectionTest reflectionTest = objTest2 as ReflectionTest;//as转换的好处,它不报错,类型不对的话就返回null
reflectionTest.Show1();

//调用私有方法
var method = type.GetMethod("Show2", BindingFlags.Instance | BindingFlags.NonPublic);
method.Invoke(objTest2, new object[] { });

调用泛型方法

//泛型无参数
var method3 = type.GetMethod("Show3");//查找指定方法
var genericMethod = method3.MakeGenericMethod(new Type[] { typeof(int) });//指定泛型参数类型T
genericMethod.Invoke(objTest2, new object[] { });

//泛型有参数
var method4 = type.GetMethod("Show4");//查找指定方法
var genericMethod4 = method4.MakeGenericMethod(new Type[] { typeof(string) });//指定泛型参数类型T
genericMethod4.Invoke(objTest2, new object[] { 123, "泛型string参数" });

反射测试类

位于SqlServerDB.dll中的ReflectionTest.cs文件中

    /// <summary>
    /// 反射测试类
    /// </summary>
   public class ReflectionTest
    {
        //私有构造函数
        private ReflectionTest()
        {
            Console.WriteLine("这是私有无参数构造方法");
        }

        //普通构造函数
        //public ReflectionTest()
        //{
        //    Console.WriteLine("这是无参数构造方法");
        //}

        public ReflectionTest(string name)
        {
            Console.WriteLine($"这是有参数构造方法+参数值是:{name}");
        }

        public void Show1()
        {
            Console.WriteLine("调用普通方法", this.GetType());
        }

        private void Show2()
        {
            Console.WriteLine("调用私有方法",this.GetType());
        }


        public void Show3<T>()
        {
            Console.WriteLine("调用无参数泛型方法", this.GetType());
        }

        public void Show4<T>(int id,string name)
        {
            Console.WriteLine($"调用有参数泛型方法,参数是{id},{name}", this.GetType());
        }
    }

操作泛型类和泛型方法

加载DLL文件

Assembly assembly = Assembly.LoadFrom(@"SqlServerDB.dll");

获取指定类型

Type type = assembly.GetType("SqlServerDB.GenericClass`2").MakeGenericType(typeof(int), typeof(string));//一定给定具体类型参数

调用泛型方法

object objTest2 = Activator.CreateInstance(type);
var method = type.GetMethod("GenericMethod").MakeGenericMethod(typeof(int));
method.Invoke(objTest2, new object[] { });

反射测试类

位于SqlServerDB.dll中的GenericClass.cs文件中

public class GenericClass<T,W>
{
    public void GenericMethod<TType>()
    {
        Console.WriteLine("泛型类调用+泛型方法");
    }
}

操作类属性字段

加载DLL文件

Assembly assembly2 = Assembly.LoadFrom("SqlServerDB.dll");

获取指定类型

Type type2 = assembly2.GetType("SqlServerDB.PropertyClass");

调用泛型方法

object obj = Activator.CreateInstance(type2);
foreach (var property in type2.GetProperties())
{
    Console.WriteLine(property.Name);
    //给属性设置值
    if (property.Name.Equals("Id"))
    {
        property.SetValue(obj, 1);
    }
    else if (property.Name.Equals("Name"))
    {
        property.SetValue(obj, "学习编程");
    }
    else if (property.Name.Equals("Phone"))
    {
        property.SetValue(obj, "123459789");
    }
    //获取属性值
    Console.WriteLine(property.GetValue(obj));
}

反射测试类

位于SqlServerDB.dll中的PropertyClass.cs文件中

public class PropertyClass
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Phone { get; set; }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C# out关键词的应用实例

    C# out关键词的应用实例

    下面小编就为大家分享一篇C# out关键词的应用实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • C#中的Internal关键字小结

    C#中的Internal关键字小结

    这篇文章主要介绍了C#中的Internal关键字小结的相关资料,需要的朋友可以参考下
    2017-05-05
  • 初学C#所需明白的那些点

    初学C#所需明白的那些点

    这篇文章主要介绍了初学C#所需明白的那些点,以及一些零碎知识点笔记,以供大家学习参考
    2023-03-03
  • C#重写DataGridView

    C#重写DataGridView

    这篇文章主要为大家详细介绍了C#重写DataGridView的相关资料,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • C#反射调用dll文件中的方法操作泛型与属性字段

    C#反射调用dll文件中的方法操作泛型与属性字段

    这篇文章介绍了C#反射调用dll文件中的方法操作泛型与属性字段,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#/VB.NET读取条码类型及条码在图片中的坐标位置实例

    C#/VB.NET读取条码类型及条码在图片中的坐标位置实例

    我们在创建条形码时,如果以图片的方式将创建好的条码保存到指定文件夹路径,可以在程序中直接加载图片使用;已生成的条码图片,需要通过读取图片中的条码信息,如条码类型、条码绘制区域在图片中的四个顶点坐标位置等,可参考本文中的方法
    2023-10-10
  • C#8.0中新语法“is{}“的介绍及使用小结

    C#8.0中新语法“is{}“的介绍及使用小结

    is模式匹配操作符通过测试一个变量是否是一个对象,来判断其是否不为null值,本文主要介绍了C#8.0中新语法“is{}“的介绍及使用小结,感兴趣的可以了解一下
    2023-11-11
  • 浅析C#数据类型转换的几种形式

    浅析C#数据类型转换的几种形式

    本篇文章是对C#中数据类型转换的几种形式进行了详细的分析介绍,需要的朋友参考下
    2013-07-07
  • C#实现设置电脑显示器参数

    C#实现设置电脑显示器参数

    这篇文章主要为大家详细介绍了如何利用C#实现设置电脑显示器参数,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • 详解C#如何在不同工作簿之间复制选定单元格区域

    详解C#如何在不同工作簿之间复制选定单元格区域

    处理Excel文档时,我们经常需要将数据整合到一个工作表以便于我们进行管理或数据对比。本文将演示如何通过编程方式将选定的单元格区域从一个工作簿复制到另一个工作簿
    2023-02-02

最新评论