四、Attribute

Attribute分两种

Attribute称为特性,语法:特性(Attribute)的名称和值是在方括号内规定的,放置在它所应用的元素之前。

1、ActionFilterAttribute(过滤器)
自定义Filter需要继承ActionFilterAttribute抽象类:例如Action控制器用于登录时候的验证有四种:分别

public class FilterAttribute : ActionFilterAttribute
{
    public string Message { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);
        filterContext.HttpContext.Response.Write("Action执行之前" + Message + "<br />");
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);
        filterContext.HttpContext.Response.Write("Action执行之后" + Message + "<br />");
    }

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        base.OnResultExecuting(filterContext);
        filterContext.HttpContext.Response.Write("返回Result之前" + Message + "<br />");
    }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        base.OnResultExecuted(filterContext);
        filterContext.HttpContext.Response.Write("返回Result之后" + Message + "<br />");
    }
} 

  然后在调用过滤器的时候,添加上该参数,Controller代码如下:

[Filter(Message="刘备")] //参数给上
public ActionResult Index()
{
    return View();
} 

另一种使用方式是进入Control执行下Action也执行一下

通过如果标签打到Controller上的话,TestFilterAttributeFilter将作用到Controller下的所有的Action。 

  默认情况下Action上打了某个自定义标签后,虽然在Controller上也打上了此标签,但它只有Action上的标签起作用了。
  补充:如果Action没有打上该标签,那么Controller上的标签便会被执行。

如果想让Action上的标签执行一次,然后Controller上的标签也执行一次,那么应该如何操作呢?

 我们只需在FilterAttribute类的定义上打上标记[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]即可也就是让其成为可以多次执行的Action。

[AttributeUsage(AttributeTargets.All,AllowMultiple = true)]
    public class FilterAttribute : ActionFilterAttribute
    {
        public string Message { get; set; }
        ......

  

有时我们想有些公共的方法需要每个Action都执行,但是又不想再每一个Controller上都打上Action标签?答案就在Global.asax中。

如果是WebAPI则是WebApiConfig.cs中配置全局。

2、FlagAttribute

 枚举优雅基本用法-在值String和int之间转换

Flags方式 

  如果对一个值可以包含多个,那么可以使用枚举,加上Flags

  1. 使用FlagsAttribute枚举才是对数字值执行按位运算 (AND、 OR 独占或) 的自定义属性。
  2. 在 2 的幂,即 1、 2、 4、 8 等中定义枚举常量。 这意味着不重叠中组合的枚举常量的各个标志。

在权限的管理中,常常会出现一个权限包含的现象。例如,有三种基本权限:职员A、职员B、职员C.在此基础上,有经理权限,它包括A和B两种权限;还有老板权限,包含A/B/C三种权限。

在代码中,我们可以用枚举来管理这些权限。

 class Program
    {
        [Flags]//表示可以将枚举对象视为位标志
        public enum EnumHasFlag
        {
            A = 1 << 0,
            B = 1 << 1,
            C = 1 << 2,  //定义权限枚举
            Manager = A | B, //通过Flags进行域计算得到的另一个枚举
            Boss = A | B | C,
        }//权限设计如果是常量的话通常用2的幂次方,防止值重复

        /*
        <<左移操作符,
        将第一个操作数向左移动第二个操作数指定的位数,空出的位置补0。
        左移相当于乘. 左移一位相当于乘2;左移两位相当于乘4;左移三位相当于乘8。
        如:
        x<<1= x*2
        x<<2= x*4
        x<<3= x*8
        x<<4= x*16
        */
        
        static void Main(string[] args)
        {
            var rightA = EnumHasFlag.Boss;
            var rightB = EnumHasFlag.Manager;
            
            if (rightA.HasFlag(EnumHasFlag.C)) Console.WriteLine("rightA can do this");
            if (rightB.HasFlag(EnumHasFlag.C)) Console.WriteLine("rightB can do this");          
        }
    }

  

  

 3、DescriptionAttribute

所谓的enum扩展 其实就是用反射动态获取给定值

一、C#中几个简单的内置Attribute

1、Conditional:起条件编译的作用,只有满足条件,才允许编译器对它的代码进行编译。一般在程序调试的时候使用。 
2、DllImport:用来标记非.NET的函数,表明该方法在一个外部的DLL中定义。 
3、Obsolete:这个属性用来标记当前的方法已经被废弃,不再使用了。

C# typeof() 和 GetType()区是什么?
1、typeof(x)中的x,必须是具体的类名、类型名称等,不可以是变量名称。 
2、GetType()方法继承自Object,所以C#中任何对象都具有GetType()方法,它的作用和typeof()相同,返回Type类型的当前对象的类型。 

比如有这样一个变量i: 
Int32 i = new Int32(); 

i.GetType()返回值是Int32的类型,但是无法使用typeof(i),因为i是一个变量,如果要使用typeof(),则只能:typeof(Int32),返回的同样是Int32的类型。

  

猜你喜欢

转载自www.cnblogs.com/fger/p/10706308.html
今日推荐