Attribute(資料過濾)

  起先跟朋友在寫專案時,在登入遇到了許多難題,在討論的過程中,發現Attribute是個很神奇的語法,似乎加上一串程式碼,背後就替我們完成了很多事情,因此對Attribute產生了許多疑問,於是趁著假日趕快弄懂Attribute的原理,趁著還記憶還清晰的時候,趕快把Code記錄下來,以便未來要使用的時候可以複製貼上

  大致上可以將Attribute解釋為,透過外部的程式碼,管理內部程式碼的概念,也就是說只要加入了Attribute,就會在背地裡替我們執行其他的事情,有可能是驗證、有可能是過濾,也有可能是我們想統一管理的方法。

參考來源:

1.一秒看破 C# Attribute 

2.[ASP.Net MVC] 自訂Custom Validation Attribute進行Model驗證

這二篇在做的事情有點不同,寫Code的方式也不同。

第一項在做的事情是過濾資料,第二項在做的事情是驗證資料,事件觸發。

這篇文章在紀錄的是第一篇的過濾資料方式,未來有空再寫資料驗證這塊。

 

廢話不多說直接開始,建議照著步驟做

一、建立Model

using System;

public class Article
{
    public string Author { get; set; }

    public string Title { get; set; }

    public string Content { get; set; }

    public DateTime PostOn { get; set; }
}

二、建立Attribute

using System;
public class SilencerAttribute : Attribute
{
    public SilencerMode Mode { get; set; }
}

public enum SilencerMode
{
    /// <summary>
    /// 普通
    /// </summary>
    Normal,
    /// <summary>
    /// 嚴謹
    /// </summary>
    Strict
}

3.這部分做的是取得列舉型別後,依據型別做Switch資料過濾,如果有其他資料想過濾,可以在建構子的地方自行帶資料進來過濾。

當然,在Switch中的邏輯也必須自行更換。

using System;
using System.Reflection;

public class ArticlesFactory
{

    public Article CreateArticles(Bulletin bulletin)
    {
        // 先建立Article的資料
        Article articles = new Article
        {
            Author = "野比大雄",
            Title = "多拉A夢快拿出節目不會被NCC禁播的道具",
            Content = @"原始資料",
            PostOn = DateTime.Now
        };

        // 來自於ExternalBullerin中下的Attribute
        SilencerAttribute attr = bulletin.GetType().GetCustomAttribute<SilencerAttribute>();

        // 針對Model做判斷
        switch (attr.Mode)
        {
            case SilencerMode.Normal:
                articles.Author = "野比OO";
                articles.Title = "多拉OO快拿出節目不會禁播的道具";
                articles.Content = @"只顯示二個名字";
                break;

            case SilencerMode.Strict:
                articles.Author = "OOOO";
                articles.Title = "OOOO快拿出節目不會禁播的道具";
                articles.Content = @"把名字全部碼掉";
                break;
            default:
                throw new ArgumentOutOfRangeException();
        }

        return articles;
    }
}

四、建立抽象類別,由此類別中取得Article的資料

(如果要從外部帶入資料,這邊的建構子傳入的參數就可以做修改)

public abstract class Bulletin
{
    protected Bulletin()
    {
        ArticlesFactory articlesFactory = new ArticlesFactory();
        Article = articlesFactory.CreateArticles(this);        
    }

    public Article Article { get; set; }
    public string Description { get; set; }
}

五、建立子類別,其中SilencerMode.Normal就是在第三點中,所取得的類型。

[Silencer(Mode = SilencerMode.Normal)]
public class ExternalBullerin : Bulletin
{
    public ExternalBullerin()
    {
        Description = "碼掉二個字";
    }

    public string ExternalProperty { get; set; }
}

六、傳回資料

        public ActionResult External() 
        {
            ExternalBullerin ex = new ExternalBullerin();
            return View(ex);
        }

七、由於是用MVC在寫的,所以把View部分也一併放上

@model Bulletin

@Html.DisplayFor(model => model.Article.Title)

這邊主要是用Bulletin把資料帶出來,並非Article唷!

 

完成的資料呈現

如果把第五點的Model改為SilencerMode.Strict

資料則會變成


LINE討論群FB討論區

歡迎您的加入,讓這個社群更加美好!

聯絡方式:
FaceBook
E-Mail