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
- 使用FlagsAttribute枚举才是对数字值执行按位运算 (AND、 OR 独占或) 的自定义属性。
- 在 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的类型。