纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

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

摇曳de风筝   2021-11-24 我要评论
想了解C#实现动态创建接口并调用的实例的相关内容吗摇曳de风筝在本文为您仔细讲解C#动态创建接口的相关知识和一些Code实例欢迎阅读和指正我们先划重点:c#动态实现接口,c#动态创建接口,c#动态添加接口下面大家一起来学习吧

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

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

准备工作

首先新建一个名为IAnimalinterface接口对象并定义一个Cry方法

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

然后我们分别新建一个DogCat对象并分别实现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();

运行结果如图所示

如果我们想要一次性将所有实现了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);
}

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

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

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

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

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

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

这是因为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}=>无参构造函数");
    }
}

  

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

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

最后附上完整代

GitHub

码云

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


相关文章

猜您喜欢

网友评论

Copyright 2020 www.fresh-weather.com 【世纪下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式