服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#实现动态创建接口并调用的实例

C#实现动态创建接口并调用的实例

2022-12-09 12:51摇曳de风筝 C#

这篇文章介绍了C#实现动态创建接口并调用,文中通过实例代码介绍的非常详细。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

本文简单介绍如何动态创建接口interface的实现实例对象,包含两个知识点:

  • 如何获取接口interface的所有实现实例对象?
  • 如何判断实例对象的构造函数是否有参数?

 

准备工作

首先新建一个名为IAnimal的interface接口对象,并定义一个Cry方法。

namespace DynamicCreate
{
  /// <summary>
  /// 动物
  /// </summary>
  public interface IAnimal
  {
      /// <summary>
      /// 叫
      /// </summary>
      public void Cry();
  }
}

然后,我们分别新建一个Dog,Cat对象,并分别实现Cry方法。

其中,Dog的构造函数中包含一个名为name的参数。

namespace DynamicCreate
{
  /// <summary>
  /// 狗
  /// </summary>
  public class Dog : IAnimal
  {
      /// <summary>
      /// 名字
      /// </summary>
      private string _name { get; }

      /// <summary>
      /// 有参构造函数
      /// </summary>
      /// <param name="name">狗名</param>
      public Dog(string name)
      {
          _name = name;
      }

      /// <summary>
      /// 狗叫
      /// </summary>
      public void Cry()
      {
          Console.WriteLine($"{_name}汪汪汪");
      }
  }
}

Cat的构造函数则为无参构造函数。

namespace DynamicCreate
{
  /// <summary>
  /// 猫
  /// </summary>
  public class Cat : IAnimal
  {
      /// <summary>
      /// 无参构造函数
      /// </summary>
      public Cat()
      {

      }

      /// <summary>
      /// 猫叫
      /// </summary>
      public void Cry()
      {
          Console.WriteLine("喵喵喵");
      }
  }
}

常规的调用方法如下所示。

IAnimal animal_Dog = new Dog("旺财");
animal_Dog.Cry();
IAnimal animal_Cat = new Cat();
animal_Cat.Cry();

运行结果如图所示

C#实现动态创建接口并调用的实例

如果我们想要一次性将所有实现了IAnimal接口对象Cry方法的实例全部执行一遍,只能一个对象一个对象的初始化,然后调用cry方法。这样太麻烦,我们可以通过动态创建对象并执行对象的方法来实现这个效果。  

下面,我们将开始动态创建所有实现。第一步,我们需要先获取到所有实现了IAnimal实例对象。

 

1.如何获取接口interface的所有实现实例对象?

通过反射来获取当前项目中的程序集对象列表,并根据程序集对象的类型来获取继承或实现了IAnimal接口的对象列表。

//获取实现接口IAnimal的实例对象
var types = AppDomain.CurrentDomain.GetAssemblies()
                      .SelectMany(a => a.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(IAnimal))))
                      .ToList(); 

我们将结果打印出来看一下

foreach (Type t in types)
{
  Console.WriteLine(t.Name);
}

C#实现动态创建接口并调用的实例

现在,我们已经得到了所有实现IAnimal接口的实例对象。讲道理来说,我们就可以用Activator动态创建这些对象了。我们可以使用下面的代码来实现批量动态创建对象。

foreach (Type t in types)
{
  var animal = (IAnimal)Activator.CreateInstance(t)!;
  animal.Cry();
}

然而,却出现一个错误提示:Dog不包含一个无参构造函数。

C#实现动态创建接口并调用的实例

所以,创建时需要将Dog的构造函数参数name传递进去,如下所示。

foreach (Type t in types)
{
  var animal = (IAnimal)Activator.CreateInstance(t, new object[] { "阿黄" })!;
  animal.Cry();
}

然而,再次提示:Cat的构造函数不存在。

C#实现动态创建接口并调用的实例

这是因为Cat不包含一个带参数的构造函数,所示无法初始化Cat对象。所以,我们需要判断对象是否是有参构造函数或无参构造函数。

 

2.如何判断实例对象的构造函数是否有参数?

我们可以通过GetConstructors方法来获取对象的构造函数集合,并通过GetParameters方法获取到构造函数的参数集合,判断构造函数的参数集合是否为空即可判断该对象的构造函数是否为有参或无参构造函数。

foreach (Type v in types)
{
  if (v.GetConstructors().Any(x => x.GetParameters().Any()))
  {
      Console.WriteLine($"{v.Name}=>有参构造函数");
  }
  else
  {
      Console.WriteLine($"{v.Name}=>无参构造函数");
  }
}

  C#实现动态创建接口并调用的实例

现在,我们可以愉快的创建对象,并调用对象的方法了。

foreach (Type t in types)
{
  IAnimal animal;
  if (t.GetConstructors().Any(x => x.GetParameters().Any()))
  {
      //有参构造函数
      //动态创建IAnimal的有参构造函数实现实例对象Dog
      animal = (IAnimal)Activator.CreateInstance(t, new object[] { "阿黄" })!;
  }
  else
  {
      //无参构造函数
      //动态创建IAnimal的无参构造函数实现实例对象Cat
      animal = (IAnimal)Activator.CreateInstance(t, new object[] { })!;
  }
  animal.Cry();
}

C#实现动态创建接口并调用的实例

最后,附上完整代。

GitHub

码云

到此这篇关于C#实现动态创建接口并调用的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://www.cnblogs.com/pinzi/p/15598531.html

延伸 · 阅读

精彩推荐
  • C#详解C#中SqlParameter的作用与用法

    详解C#中SqlParameter的作用与用法

    本篇文章主要介绍了C#中SqlParameter的作用与用法,因为通过SQL语句的方式,有时候存在脚本注入的危险,所以在大多数情况下不建议用拼接SQL语句字符串方式...

    -且听风吟-3992021-12-16
  • C#WinForm实现的图片拖拽与缩放功能示例

    WinForm实现的图片拖拽与缩放功能示例

    这篇文章主要介绍了WinForm实现的图片拖拽与缩放功能,结合具体实例形式分析了WinForm鼠标事件响应及图片元素动态操作相关实现技巧,需要的朋友可以参考下...

    何问起11602022-01-05
  • C#深入浅析c#静态多态性与动态多态性

    深入浅析c#静态多态性与动态多态性

    多态就是多种形态,也就是对不同对象发送同一个消息,不同对象会做出不同的响应。这篇文章主要介绍了c#静态多态性与动态多态性的相关知识,需要的朋...

    大唐王渣渣10922022-02-28
  • C#C#设置Word文档背景的三种方法(纯色/渐变/图片背景)

    C#设置Word文档背景的三种方法(纯色/渐变/图片背景)

    本文给大家分享三种添加Word文档背景的方法,非常不错,代码简单易懂,具有参考借鉴价值,需要的朋友参考下吧...

    E-iceblue10912022-02-21
  • C#C#向PPT文档插入图片以及导出图片的实例

    C#向PPT文档插入图片以及导出图片的实例

    PowerPoint演示文稿是我们日常工作中常用的办公软件之一,本篇文章介绍了C#向PPT文档插入图片以及导出图片的实例,非常具有实用价值,需要的朋友可以参...

    Yesi4852021-12-15
  • C#C#中抽象类与接口的区别详解

    C#中抽象类与接口的区别详解

    本文主要介绍了C#中抽象类与接口的区别。具有很好的参考价值。下面跟着小编一起来看下吧...

    淡泊明志_宁静3762021-12-29
  • C#c# 生成二维码的示例

    c# 生成二维码的示例

    这篇文章主要介绍了c# 生成二维码的示例,帮助大家更好的理解和使用c#编程语言,感兴趣的朋友可以了解下...

    UP技术控8072022-10-17
  • C#C# 复制与删除文件的实现方法

    C# 复制与删除文件的实现方法

    这篇文章主要介绍了C# 复制与删除文件的实现方法的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下...

    晨曦8887362022-01-24