C#實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建接口并調(diào)用的實(shí)例
本文簡單介紹如何動(dòng)態(tài)創(chuàng)建接口interface
的實(shí)現(xiàn)實(shí)例對(duì)象,包含兩個(gè)知識(shí)點(diǎn):
- 1.如何獲取接口
interface
的所有實(shí)現(xiàn)實(shí)例對(duì)象? - 2.如何判斷實(shí)例對(duì)象的構(gòu)造函數(shù)是否有參數(shù)?
準(zhǔn)備工作
首先新建一個(gè)名為IAnimal
的interface
接口對(duì)象,并定義一個(gè)Cry
方法。
namespace DynamicCreate { /// <summary> /// 動(dòng)物 /// </summary> public interface IAnimal { /// <summary> /// 叫 /// </summary> public void Cry(); } }
然后,我們分別新建一個(gè)Dog
,Cat
對(duì)象,并分別實(shí)現(xiàn)Cry
方法。
其中,Dog
的構(gòu)造函數(shù)中包含一個(gè)名為name
的參數(shù)。
namespace DynamicCreate { /// <summary> /// 狗 /// </summary> public class Dog : IAnimal { /// <summary> /// 名字 /// </summary> private string _name { get; } /// <summary> /// 有參構(gòu)造函數(shù) /// </summary> /// <param name="name">狗名</param> public Dog(string name) { _name = name; } /// <summary> /// 狗叫 /// </summary> public void Cry() { Console.WriteLine($"{_name}汪汪汪"); } } }
Cat
的構(gòu)造函數(shù)則為無參構(gòu)造函數(shù)。
namespace DynamicCreate { /// <summary> /// 貓 /// </summary> public class Cat : IAnimal { /// <summary> /// 無參構(gòu)造函數(shù) /// </summary> public Cat() { } /// <summary> /// 貓叫 /// </summary> public void Cry() { Console.WriteLine("喵喵喵"); } } }
常規(guī)的調(diào)用方法如下所示。
IAnimal animal_Dog = new Dog("旺財(cái)"); animal_Dog.Cry(); IAnimal animal_Cat = new Cat(); animal_Cat.Cry();
運(yùn)行結(jié)果如圖所示
如果我們想要一次性將所有實(shí)現(xiàn)了IAnimal
接口對(duì)象Cry
方法的實(shí)例全部執(zhí)行一遍,只能一個(gè)對(duì)象一個(gè)對(duì)象的初始化,然后調(diào)用cry
方法。這樣太麻煩,我們可以通過動(dòng)態(tài)創(chuàng)建對(duì)象并執(zhí)行對(duì)象的方法來實(shí)現(xiàn)這個(gè)效果?! ?/p>
下面,我們將開始動(dòng)態(tài)創(chuàng)建所有實(shí)現(xiàn)。第一步,我們需要先獲取到所有實(shí)現(xiàn)了IAnimal
實(shí)例對(duì)象。
1.如何獲取接口interface的所有實(shí)現(xiàn)實(shí)例對(duì)象?
通過反射來獲取當(dāng)前項(xiàng)目中的程序集對(duì)象列表,并根據(jù)程序集對(duì)象的類型來獲取繼承或?qū)崿F(xiàn)了IAnimal
接口的對(duì)象列表。
//獲取實(shí)現(xiàn)接口IAnimal的實(shí)例對(duì)象 var types = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(a => a.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(IAnimal)))) .ToList();
我們將結(jié)果打印出來看一下
foreach (Type t in types) { Console.WriteLine(t.Name); }
現(xiàn)在,我們已經(jīng)得到了所有實(shí)現(xiàn)IAnimal
接口的實(shí)例對(duì)象。講道理來說,我們就可以用Activator
動(dòng)態(tài)創(chuàng)建這些對(duì)象了。我們可以使用下面的代碼來實(shí)現(xiàn)批量動(dòng)態(tài)創(chuàng)建對(duì)象。
foreach (Type t in types) { var animal = (IAnimal)Activator.CreateInstance(t)!; animal.Cry(); }
然而,卻出現(xiàn)一個(gè)錯(cuò)誤提示:Dog
不包含一個(gè)無參構(gòu)造函數(shù)。
所以,創(chuàng)建時(shí)需要將Dog
的構(gòu)造函數(shù)參數(shù)name
傳遞進(jìn)去,如下所示。
foreach (Type t in types) { var animal = (IAnimal)Activator.CreateInstance(t, new object[] { "阿黃" })!; animal.Cry(); }
然而,再次提示:Cat
的構(gòu)造函數(shù)不存在。
這是因?yàn)?code>Cat不包含一個(gè)帶參數(shù)的構(gòu)造函數(shù),所示無法初始化Cat
對(duì)象。所以,我們需要判斷對(duì)象是否是有參構(gòu)造函數(shù)或無參構(gòu)造函數(shù)。
2.如何判斷實(shí)例對(duì)象的構(gòu)造函數(shù)是否有參數(shù)?
我們可以通過GetConstructors
方法來獲取對(duì)象的構(gòu)造函數(shù)集合,并通過GetParameters
方法獲取到構(gòu)造函數(shù)的參數(shù)集合,判斷構(gòu)造函數(shù)的參數(shù)集合是否為空即可判斷該對(duì)象的構(gòu)造函數(shù)是否為有參或無參構(gòu)造函數(shù)。
foreach (Type v in types) { if (v.GetConstructors().Any(x => x.GetParameters().Any())) { Console.WriteLine($"{v.Name}=>有參構(gòu)造函數(shù)"); } else { Console.WriteLine($"{v.Name}=>無參構(gòu)造函數(shù)"); } }
現(xiàn)在,我們可以愉快的創(chuàng)建對(duì)象,并調(diào)用對(duì)象的方法了。
foreach (Type t in types) { IAnimal animal; if (t.GetConstructors().Any(x => x.GetParameters().Any())) { //有參構(gòu)造函數(shù) //動(dòng)態(tài)創(chuàng)建IAnimal的有參構(gòu)造函數(shù)實(shí)現(xiàn)實(shí)例對(duì)象Dog animal = (IAnimal)Activator.CreateInstance(t, new object[] { "阿黃" })!; } else { //無參構(gòu)造函數(shù) //動(dòng)態(tài)創(chuàng)建IAnimal的無參構(gòu)造函數(shù)實(shí)現(xiàn)實(shí)例對(duì)象Cat animal = (IAnimal)Activator.CreateInstance(t, new object[] { })!; } animal.Cry(); }
最后,附上完整代。
到此這篇關(guān)于C#實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建接口并調(diào)用的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#中LINQ?to?DataSet操作及DataTable與LINQ相互轉(zhuǎn)換
這篇文章介紹了C#中LINQ?to?DataSet操作及DataTable與LINQ相互轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05C#表達(dá)式樹Expression動(dòng)態(tài)創(chuàng)建表達(dá)式
這篇文章介紹了C#表達(dá)式樹Expression動(dòng)態(tài)創(chuàng)建表達(dá)式的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12C#通過第三方組件生成二維碼(QR Code)和條形碼(Bar Code)
用C#如何生成二維碼,我們可以通過現(xiàn)有的第三方dll直接來實(shí)現(xiàn),下面列出幾種不同的生成方法2016-12-12unity通過Mesh網(wǎng)格繪制圖形(三角形、正方體、圓柱)
這篇文章主要為大家詳細(xì)介紹了unity通過Mesh網(wǎng)格繪制圖形:三角形、正方體、圓柱,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11