国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

.NET Core反射獲取帶有自定義特性的類,通過依賴注入根據(jù)Attribute元數(shù)據(jù)信息調(diào)用對應(yīng)的方法

這篇具有很好參考價(jià)值的文章主要介紹了.NET Core反射獲取帶有自定義特性的類,通過依賴注入根據(jù)Attribute元數(shù)據(jù)信息調(diào)用對應(yīng)的方法。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

  前段時(shí)間有朋友問道一個(gè)這樣的問題,.NET Core中如何通過Attribute的元數(shù)據(jù)信息來調(diào)用標(biāo)記的對應(yīng)方法。我第一時(shí)間想到的就是通過C#反射獲取帶有Custom Attribute標(biāo)記的類,然后通過依賴注入(DI)的方式獲取對應(yīng)服務(wù)的方法并通過反射動(dòng)態(tài)執(zhí)行類的方法,從而實(shí)現(xiàn)更靈活的編程方式。

C#中反射指的是什么?

開篇之前首先和大家簡單介紹一下反射的概念和作用。

在 C# 中,反射是指在運(yùn)行時(shí)動(dòng)態(tài)地獲取類型的信息并操作對象的能力。使用反射,我們可以在代碼中訪問程序集、模塊、成員等,并且可以操作這些成員的屬性、方法、字段和事件等。

自定義一個(gè)Attribute類型

/// <summary>
/// 自定義一個(gè)Attribute類型
/// </summary>
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class CustomAttribute : Attribute
{
    public string TargetMethod { get; set; }

    public CustomAttribute(string targetMethod)
    {
        TargetMethod = targetMethod;
    }
}

定義如下兩個(gè)需要被執(zhí)行的服務(wù),并使用CustomAttribute標(biāo)記

/// <summary>
/// 前進(jìn)服務(wù)
/// </summary>
[Custom("AdvanceWay")]
public class AdvanceService
{
    public void AdvanceWay()
    {
        Console.WriteLine("On the move!");
    }
}

/// <summary>
/// 后退服務(wù)
/// </summary>
[Custom("RetreatWay")]
public class RetreatService
{
    public void RetreatWay()
    {
        Console.WriteLine("Be retreating!");
    }
}

注冊需要注入的服務(wù)

var services = new ServiceCollection();

//注冊需要注入的服務(wù)
services.AddTransient<AdvanceService>();
services.AddTransient<RetreatService>();

反射獲取所有帶有CustomAttribute特性的類并調(diào)用對應(yīng)方法

    static void Main(string[] args)
    {
        var services = new ServiceCollection();

        //注冊需要注入的服務(wù)
        services.AddTransient<AdvanceService>();
        services.AddTransient<RetreatService>();

        var provider = services.BuildServiceProvider();

        #region 反射獲取所有帶有CustomAttribute特性的類并調(diào)用對應(yīng)方法

        //反射獲取所有帶有CustomAttribute特性的類
        var classes = Assembly.GetExecutingAssembly().GetTypes()
            .Where(type => type.GetCustomAttributes<CustomAttribute>().Any());

        foreach (var clazz in classes)
        {
            //獲取標(biāo)記CustomAttribute的實(shí)例
            var attr = clazz.GetCustomAttributes<CustomAttribute>().First();

            //根據(jù)CustomAttribute元數(shù)據(jù)信息調(diào)用對應(yīng)的方法
            var methodInfo = clazz.GetMethod(attr.TargetMethod);
            if (methodInfo != null)
            {
                //instance 對象是通過依賴注入容器獲取的。這是一種常用的實(shí)現(xiàn)方式,可以使用依賴注入解耦程序中各個(gè)組件之間的依賴關(guān)系,方便測試和維護(hù)。
                var instance = provider.GetService(clazz);
                methodInfo.Invoke(instance, null);
            }
        }

        #endregion

        #region 反射獲取所有帶有CustomAttribute特性的類并調(diào)用指定方法

        var executionMethod = "RetreatWay";

        foreach (var clazz in classes)
        {
            //獲取標(biāo)記CustomAttribute的實(shí)例
            var attr = clazz.GetCustomAttributes<CustomAttribute>().First();

            if (attr.TargetMethod == executionMethod)
            {
                //根據(jù)CustomAttribute元數(shù)據(jù)信息調(diào)用對應(yīng)的方法
                var methodInfo = clazz.GetMethod(attr.TargetMethod);
                if (methodInfo != null)
                {
                    //instance 對象是通過依賴注入容器獲取的。這是一種常用的實(shí)現(xiàn)方式,可以使用依賴注入解耦程序中各個(gè)組件之間的依賴關(guān)系,方便測試和維護(hù)。
                    var instance = provider.GetService(clazz);
                    methodInfo.Invoke(instance, null);
                }
            }
        }

        #endregion

        Console.ReadLine();
    }

輸出如下:

.NET Core反射獲取帶有自定義特性的類,通過依賴注入根據(jù)Attribute元數(shù)據(jù)信息調(diào)用對應(yīng)的方法

?文章來源地址http://www.zghlxwxcb.cn/news/detail-413579.html

到了這里,關(guān)于.NET Core反射獲取帶有自定義特性的類,通過依賴注入根據(jù)Attribute元數(shù)據(jù)信息調(diào)用對應(yīng)的方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • (十二)反射與特性 -反射與預(yù)定義特性(1)

    1、什么是反射 了解反射之前,要先了解一下元數(shù)據(jù)。元數(shù)據(jù)指保存在程序集中的一些有關(guān)程序及其類型的數(shù)據(jù),包括類、結(jié)構(gòu)、委托、接口和枚舉等)的成員和成員的信息。 程序在運(yùn)行時(shí),可以查看程序集以及其本身的元數(shù)據(jù),是反射。 通過反射,可以在運(yùn)行時(shí)獲取程序或

    2024年02月09日
    瀏覽(24)
  • 【.NET Core】反射(Reflection)詳解(三)

    反射提供了對已封裝的程序集、模型和類型的對象一種動(dòng)態(tài)訪問方法。反射包含動(dòng)態(tài)加載程序集的Assembly類、程序集中模塊訪問的Module類、對類信息Type類、構(gòu)造函數(shù)信息ConstructorInfo類、方法信息MethodInfo類、字段信息FieldInfo類、事件信息EventInfo類、屬性信息PropertyInfo類、參數(shù)信

    2024年02月03日
    瀏覽(54)
  • 《尚賢達(dá)獵頭網(wǎng)站流量統(tǒng)計(jì)模塊》,通過HTTP自定義模塊實(shí)時(shí)獲取asp.net網(wǎng)站訪問流量,并保存到數(shù)據(jù)庫

    開發(fā)了個(gè)網(wǎng)站流量統(tǒng)計(jì)模塊,實(shí)時(shí)獲取asp.net網(wǎng)站訪問流量,并保存到數(shù)據(jù)庫。 一、功能: 通過HTTP自定義模塊實(shí)時(shí)獲取網(wǎng)站流量 二、支持平臺(tái):windows+IIS 三、安裝方法: 1、將文件www.sunsharer.cn.dll復(fù)制到網(wǎng)站bin目錄下; 2、將配置好的sqlstr.txt復(fù)制到網(wǎng)站bin目錄下; 3、將數(shù)據(jù)

    2024年01月16日
    瀏覽(24)
  • C#利用自定義特性以及反射,來提大型項(xiàng)目的開發(fā)的效率

    C#利用自定義特性以及反射,來提大型項(xiàng)目的開發(fā)的效率

    ? 在大型項(xiàng)目的開發(fā)過程中,需要多人協(xié)同工作,來加速項(xiàng)目完成進(jìn)度。 比如一個(gè)軟件有100個(gè)form,分給100個(gè)人來寫,每個(gè)人完成自己的Form.cs的編寫之后,要在Mainform調(diào)用自己寫的Form。 如果按照正常的Form form1 = new Form()這種寫法來構(gòu)造窗口的話,相當(dāng)于每個(gè)人都要改動(dòng)Mainfo

    2024年02月14日
    瀏覽(30)
  • Java中的反射(通過反射獲取類的結(jié)構(gòu)、invoke方法、獲取注解)

    Java中的反射(通過反射獲取類的結(jié)構(gòu)、invoke方法、獲取注解)

    創(chuàng)建運(yùn)行時(shí)類的對象是反射機(jī)制應(yīng)用最多的地方。創(chuàng)建運(yùn)行時(shí)類的對象有兩種方式: 方式1:直接調(diào)用Class對象的newInstance()方法 要求: 1)類必須有一個(gè)無參數(shù)的構(gòu)造器。 2)類的構(gòu)造器的訪問權(quán)限需要足夠。 方式一的步驟 : 1)獲取該類型的Class對象 2)調(diào)用Class對象的 new

    2024年02月04日
    瀏覽(28)
  • R語言【taxa】——從taxa 定義的類中獲取組分信息

    Package? taxa ?version 0.4.2 ? ? ? ? 在擁有對應(yīng)信息的對象中設(shè)置和獲取類群所有權(quán)信息。 ? ? ? ? 設(shè)置和獲取分類群的作者信息。 ? ? ? ? 設(shè)置和獲取分類群的引用信息。 ? ? ? ? 設(shè)置和獲取分類群的日期信息。 ? ? ? ? 設(shè)置和獲取分類群的數(shù)據(jù)庫信息。 ? ? ? ? 設(shè)置和獲

    2024年01月24日
    瀏覽(28)
  • Go語言通過反射獲取各種類型變量的值

    反射是程序在運(yùn)行期間獲取變量的類型和值、或者執(zhí)行變量的方法的能力。 反射是程序在運(yùn)行期間獲取變量的類型和值、或者執(zhí)行變量的方法的能力。 Golang 反射包中有兩對非常重要的函數(shù)和類型,兩個(gè)函數(shù)分別是: reflect.TypeOf 能獲取類型信息 reflect.Type; reflect.ValueOf 能獲取

    2024年02月15日
    瀏覽(25)
  • 【asp.net core】自定義模型綁定及其驗(yàn)證

    水此篇博客,依舊是來自群里的討論,最后說到了,在方法參數(shù)自定義了一個(gè)特性,用來綁定模型,優(yōu)先從Form取,如果為空,或者不存在,在從QueryString中獲取并且綁定,然后閑著無聊,就水一篇博客,如果大家有什么需求或者問題,可以找我,很高興能為你們帶來幫助。

    2024年02月03日
    瀏覽(28)
  • ASP.NET Core 授權(quán)二(自定義token)

    首先自定義一個(gè)類TokenAuthenticationHandler,然后需要繼承IAuthenticationHandler接口 具體代碼: 后續(xù)需要鑒權(quán)的接口,在請求上都需要加上Authorization參數(shù) Claim:相當(dāng)于一個(gè)身份單元,存儲(chǔ)著鍵值信息 ClaimsIdentity:身份證,身份單元的集合(可以理解為身份證上有多個(gè)身份單元) Clai

    2024年02月03日
    瀏覽(25)
  • .net core Api獲取所有Action以及注釋內(nèi)容

    有個(gè)項(xiàng)目需要獲取項(xiàng)目內(nèi)所有Action,并在凌晨定時(shí)任務(wù)跑完所有接口檢查是否有接口報(bào)錯(cuò),寫了如下方法: 實(shí)體類: 使用: ?

    2024年02月11日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包