欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建接口并調(diào)用的實(shí)例

 更新時(shí)間:2021年11月24日 17:28:29   作者:搖曳de風(fēng)箏  
這篇文章介紹了C#實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建接口并調(diào)用,文中通過實(shí)例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

本文簡單介紹如何動(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è)名為IAnimalinterface接口對(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();
}

最后,附上完整代。

GitHub

碼云

到此這篇關(guān)于C#實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建接口并調(diào)用的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 實(shí)例代碼講解c# 線程(上)

    實(shí)例代碼講解c# 線程(上)

    這篇文章主要介紹了講解c# 線程的的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • WPF下如何自定義MessageBox消息提示

    WPF下如何自定義MessageBox消息提示

    這篇文章主要介紹了WPF下如何自定義MessageBox消息提示問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • C#中LINQ?to?DataSet操作及DataTable與LINQ相互轉(zhuǎn)換

    C#中LINQ?to?DataSet操作及DataTable與LINQ相互轉(zhuǎn)換

    這篇文章介紹了C#中LINQ?to?DataSet操作及DataTable與LINQ相互轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • C#表達(dá)式樹Expression動(dòng)態(tài)創(chuàng)建表達(dá)式

    C#表達(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-12
  • 深入理解C# DateTime日期格式化

    深入理解C# DateTime日期格式化

    在C#中DateTime是一個(gè)包含日期、時(shí)間的類型,此類型通過ToString()轉(zhuǎn)換為字符串時(shí),可根據(jù)傳入給Tostring()的參數(shù)轉(zhuǎn)換為多種字符串格式。
    2017-01-01
  • C#通過第三方組件生成二維碼(QR Code)和條形碼(Bar Code)

    C#通過第三方組件生成二維碼(QR Code)和條形碼(Bar Code)

    用C#如何生成二維碼,我們可以通過現(xiàn)有的第三方dll直接來實(shí)現(xiàn),下面列出幾種不同的生成方法
    2016-12-12
  • C#使用LitJson解析JSON的示例代碼

    C#使用LitJson解析JSON的示例代碼

    本篇文章主要介紹了C#使用LitJson解析JSON的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • unity通過Mesh網(wǎng)格繪制圖形(三角形、正方體、圓柱)

    unity通過Mesh網(wǎng)格繪制圖形(三角形、正方體、圓柱)

    這篇文章主要為大家詳細(xì)介紹了unity通過Mesh網(wǎng)格繪制圖形:三角形、正方體、圓柱,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 使用?CliWrap?讓C#中的命令行交互(推薦)

    使用?CliWrap?讓C#中的命令行交互(推薦)

    這篇文章主要介紹了使用?CliWrap?讓C#中的命令行交互舉重若輕,這是一個(gè)在?.NET?平臺(tái)使用的命令行交互工具庫,?通過在C#?中使用?Fluent?的API,?讓命令行交互,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • C#設(shè)計(jì)模式之工廠模式

    C#設(shè)計(jì)模式之工廠模式

    本文詳細(xì)講解了C#設(shè)計(jì)模式之工廠模式,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03

最新評(píng)論