none
一个关于attribute反射解析的问题 RRS feed

  • 问题

  •  大家好,初学者对attribute的解析过程有一个问题:

    1、我想通过反射当前类的当前方法名能做到吗?

    2、想实现的功能:在方法上粘一个特性然后通过构造方法(或许还有别的“首次启动的方法?例如控制台程序中的主方法”)实现登录与权限验证。如果无法通过则发送文本给浏览器。之前只做过type.getMethod("name")这种固定取名方式,我想动态的调用当前类下的当前方法,能做到吗?例如(伪代码):

    Type type = this.getType()
    
    var attribute = type.GetMethod("this.MethodName").GetCustomAttributes(typeof(CheckLevelAttribute), false);
    CheckLevelAttribute checklog = (CheckLevelAttribute)attribute[0];


    这是现在写的代码,如果写的不好或有更好的方法请批评或告知,谢谢!

    1) 这是特性类与反射类,继承Controller,

    namespace MvcAdmin.Other { public class AdmCheckLevel : Controller { public AdmCheckLevel() {

    Type type = this.GetType(); //var method = type.GetMethod(this); var attribute = type.GetMethod("UserManager").GetCustomAttributes(typeof(CheckLevelAttribute), false); CheckLevelAttribute checklog = (CheckLevelAttribute)attribute[0]; if (checklog != null) { //检查登录 if (AdminHelper.CheckLogin()) { Response.Write(ErrorChinese.GetErrorInfoCHN(ErrorInfo.NotLogin)); return; } //判断权限 if (!new BllHelper().CheckALevel((long)AdminHelper.GetSession(), checklog.Level, WebHelper.GetMyDB)) { Response.Write(ErrorChinese.GetAPowerInfoCHN(AdmPowerInfo.AdmInfoManager)); return; } } } } [AttributeUsage(AttributeTargets.Method)] public class CheckLevelAttribute : Attribute { public AdmPowerInfo Level { get; set; } public CheckLevelAttribute(AdmPowerInfo level) { this.Level = level; } } }



    2) 这是控制器里的方法,控制器继承此类代替Controller

     
        public class AdmInfoManagerController : AdmCheckLevel
        {
    
            /// <summary>
            ///     获取后台用户信息
            /// </summary>
            /// <param name="Serach"></param>
            /// <returns></returns>
            [HttpPost]
            [CheckLevel(AdmPowerInfo.AdmInfoManager)]        //特性
            public ActionResult GetAdminInfo(string Search)
            {
             do something ..
            }

    2016年4月10日 9:03

答案

全部回复

  • 可以的,你如果知道调用方法名称,可以直接传入方法名当参数,然后GetCustomAttributes来获得自定义属性,我觉得你的代码逻辑没什么问题,不知道你具体的问题是什么的?

    关于反射的更多内容参考:

    .net反射详解


    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. My sample

    • 已建议为答案 Learning hard 2016年4月10日 9:08
    • 取消建议作为答案 Perlistan 2016年4月10日 10:33
    2016年4月10日 9:08
  • 可以的,你如果知道调用方法名称,可以直接传入方法名当参数,然后GetCustomAttributes来获得自定义属性,我觉得你的代码逻辑没什么问题,不知道你具体的问题是什么的?

    关于反射的更多内容参考:

    .net反射详解


    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. My sample

    你好朋友,我现在遇到的瓶颈就是不知道如何获取当前的方法名,就差这一步了
    2016年4月10日 10:32
  • var attribute = type.GetMethod("UserManager").GetCustomAttributes(typeof(CheckLevelAttribute), false);
                CheckLevelAttribute checklog = (CheckLevelAttribute)attribute[0];


    就卡在这一步,如何将UserManager替换为当前方法名?就是不知道如何往无参的构造方法里传值,如果是有参构造方法又要另外实例化,主要是避免同一个控制器里每个方法都要添加一次 登录验证

    var attribute = type.GetMethod("这里替换成当前方法名").GetCustomAttributes(typeof(CheckLevelAttribute), false);
                CheckLevelAttribute checklog = (CheckLevelAttribute)attribute[0];

    2016年4月10日 10:37
  • var method =new System.Diagnostics.StackTrace().GetFrame(0).GetMethod();
    var methodName =method.Name;

    更多参考:

    .NET 中获取调用方法名


    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. My sample

    2016年4月10日 10:37