本文简单介绍了如何动态创建接口实现实例对象,包括两个知识点:1、如何获取接口接口的所有实现实例对象?2、如何判断实例对象的构造函数是否带参数?准备工作首先新建一个名为IAnimal的接口对象,并定义一个Cry方法。namespaceDynamicCreate{//////动物///publicinterfaceIAnimal{//////调用///publicvoidCry();然后,我们分别新建一个Dog和Cat对象,分别实现Cry方法。其中,Dog的构造函数包含一个名为name的参数。命名空间DynamicCreate{//////Dog///publicclassDog:IAnimal{//////name///privatestring_name{get;}//////带参数的构造函数//////狗名publicDog(stringname){_name=name;}/////狗在叫///publicvoidCry(){Console.WriteLine($"{_name}WowWow");}}}Cat的构造函数是一个无参构造函数。namespaceDynamicCreate{//////Cat///publicclassCat:IAnimal{//////无参数构造函数///publicCat(){}//////猫叫声///publicvoidCry(){Console.WriteLine("meowmeow");}}}一般的调用方式如下。IAnimalanimal_Dog=newDog("旺财");animal_Dog.Cry();IAnimalanimal_Cat=newCat();animal_Cat.Cry();运行结果如图所示。如果我们想一次性实现所有IAnimal接口对象的Cry方法的所有实例都执行一次,只能一个对象一个一个初始化,然后调用cry方法。这样就太麻烦了,我们可以通过动态创建对象,执行对象方法来达到这种效果。 接下来,我们将开始动态创建所有实现。第一步,我们需要获取所有实现IAnimal的实例对象。1、如何获取接口接口的所有实现实例对象?通过反射获取当前项目中的程序集对象列表,根据程序集对象的类型获取继承或实现IAnimal接口的对象列表。//获取实现接口IAnimal的实例对象vartypes=AppDomain.CurrentDomain.GetAssemblies().SelectMany(a=>a.GetTypes().Where(t=>t.GetInterfaces().Contains(typeof(IAnimal)))).ToList(); 让我们打印结果并查看foreach(Typetintypes){Console.WriteLine(t.Name);现在,我们已经获得了实现IAnimal接口的所有实例对象。按理说,我们可以使用Activator来动态创建这些对象。我们可以使用如下代码来实现批量动态创建对象。foreach(Typetintypes){varanimal=(IAnimal)Activator.CreateInstance(t)!;动物.Cry();但是,出现错误消息:Dog不包含无参数构造函数。所以创建时需要传入Dog的构造函数参数名,如下所示。foreach(Typetintypes){varanimal=(IAnimal)Activator.CreateInstance(t,newobject[]{"阿黄"})!;动物.Cry();然而,再一次:Cat的构造函数不存在。这是因为Cat中没有带参数的构造函数,说明不能初始化Cat对象。因此,我们需要判断对象是带参数的构造函数还是不带参数的构造函数。2、如何判断实例对象的构造函数是否带参数?我们可以通过GetConstructors方法获取对象的构造函数集,通过GetParameters方法获取构造函数的参数集,通过判断构造函数的参数集是否为空来判断对象的构造函数是构造有参函数还是无参函数。foreach(Typevintypes){if(v.GetConstructors().Any(x=>x.GetParameters().Any())){Console.WriteLine($"{v.Name}=>参数化构造函数");}else{Console.WriteLine($"{v.Name}=>No-argumentconstructor");}} 现在,我们可以愉快地创建对象并调用它们的方法了。foreach(Typetintypes){IAnimal动物;if(t.GetConstructors().Any(x=>x.GetParameters().Any())){//带参数的构造函数//动态创建带参数的IAnimal构造函数实现实例对象Doganimal=(IAnimal)Activator.CreateInstance(t,newobject[]{"阿黄"})!;}else{//无参构造函数//动态创建IAnimal实例对象的无参构造函数实现Catanimal=(IAnimal)Activator.CreateInstance(t,newobject[]{})!;}animal.Cry();}最后附上完整的生成。GitHub码云C#实现动态创建和调用接口的文章到此结束。希望对大家的学习有所帮助,希望大家多多支持。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: