首页 新闻 会员 周边 捐助

C# Attribute 的AttributeTargets.Assembly 讨论

0
[已解决问题] 解决于 2015-04-07 09:13

  AttributeTargets 枚举里面有一个值为 Assembly (可以对程序集应用属性),我想问的就是在代码里面怎么写才算是对程序集应用属性?

  应该不是放在class上面或者方法、属性上面吧,命名空间前面也不能写特性啊!求教各位园友,我想实现的就是所有Controller 都能应用这个特性,而不是每个Controller都添加一遍,此处应该怎么写,还是说我理解错了这个Assembly 的意思,在线等,烦请园友们解答一下,不甚感激!

  

[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false, Inherited = true)]
    public class PowerAttribute : ActionFilterAttribute
    {
           ........              
    }
[Power()] 
public class HomeController : Controller
{
      .......  
}

提示:

错误 11 特性“Power”对此声明类型无效。它只对“assembly”声明有效。 

晓菜鸟的主页 晓菜鸟 | 老鸟四级 | 园豆:2594
提问于:2015-04-02 17:04
< >
分享
最佳答案
0

[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false, Inherited = true)]

指明了这个attribute只能应用到assembly,就只能这样用。

你可以放到assemblyinfo文件里:[assembly: power]

也可以放在任何一个代码文件里,用法一样。

如果你希望把这个attribute应用到class,可以:

[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class, AllowMultiple = false, Inherited = true)]

 

AttributeTargets有很多定义,都可以通过 或(|)操作运算符连接。

当一个attribute不指定AttributeUsage时,默认针对所有对象。

奖励园豆:5
519740105 | 大侠五级 |园豆:5810 | 2015-04-02 17:44

大神,我试了,我在AssemblyInfo中加入了[assembly:Power()]这段代码还是没起作用,我调试他也进不了我在Power里面打的断点。而且如果我指定AttributeTargets为Assembly的话,我写在类里面他也不起作用。

晓菜鸟 | 园豆:2594 (老鸟四级) | 2015-04-03 09:01

@晓菜鸟: 那是因为你的这个attribute不是为assembly准备的。

我让你加在assemblyinfo里是告诉你,你的attribute定义的usage是针对assembly的。

你要应用到HomeController类里,应该定义为AttributeTargets.Class,或者不定义Usage。

519740105 | 园豆:5810 (大侠五级) | 2015-04-03 09:03

@519740105: 我想的是让这个UI项目下面的所有控制器都应用,所以我的Usage才定义为assembly,难道他说的这个“可以对程序集应用”不是我理解的加在程序集里面就能对程序集里面的所有.CS应用这个特性的意思?

晓菜鸟 | 园豆:2594 (老鸟四级) | 2015-04-03 09:09

@晓菜鸟: 如果你想让这个UI下的所有控制器都能应用,不是这样定义。

定义Assembly是说针对Assembly的特性定义,而不是应用到Assembly中的所有类。

要达到你的目的:

1、Attribute的Usage指向Class或不设置

2、在Application_Start事件里:

GlobalFilters.Add(new FilterAttribute());

519740105 | 园豆:5810 (大侠五级) | 2015-04-03 09:11

@519740105: 嗯,先谢谢了,我先理解理解你说的话!

晓菜鸟 | 园豆:2594 (老鸟四级) | 2015-04-03 09:17

@519740105: 谢谢,功能实现了,非常感谢!完美的解决了我的问题!给你点赞!:)

代码:GlobalFilters.Filters.Add(new PowerAttribute());

晓菜鸟 | 园豆:2594 (老鸟四级) | 2015-04-03 09:38
其他回答(1)
0

你看下你的项目 AssemblyInfo.cs 文件中的 [assembly:xxxxx] 的定义。

Launcher | 园豆:45050 (高人七级) | 2015-04-02 17:15

大神,是说的这个吗?

[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false, Inherited = true)]
    public class PowerAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            string loginName = filterContext.RequestContext.HttpContext.Request["loginName"];
            if (string.IsNullOrEmpty(loginName))
            {
                filterContext.Result = new RedirectResult("http://www.cnblogs.com/");
            }
            base.OnActionExecuting(filterContext);
        }
    }

 

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2015-04-02 17:21

@晓菜鸟: 是说的这个,你只能在 AssemblyInfo.cs 中添加:

[assembly:Power()]

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2015-04-02 17:47

@Launcher: 大神,我试了,我在AssemblyInfo中加入了[assembly:Power()]这段代码还是没起作用,我调试他也进不了我在Power里打的断点。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2015-04-03 09:00

@Launcher: 谢谢大神,问题已经解决了,非常感谢!:)

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2015-04-03 09:38
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册