代码之家  ›  专栏  ›  技术社区  ›  prostynick

访问C语言中的包装方法属性#

  •  2
  • prostynick  · 技术社区  · 14 年前

    我有以下代码:

    public static void ProcessStep(Action action)
    {
        //do something here
        if (Attribute.IsDefined(action.Method, typeof(LogAttribute)))
        {
            //do something here [1]
        }
        action();
        //do something here
    }
    

    为了便于使用,我有一些类似的方法使用上述方法。例如:

    public static void ProcessStep(Action<bool> action)
    {
        ProcessStep(() => action(true)); //this is only example, don't bother about hardcoded true
    }
    

    但是当我使用第二个方法(上面的方法)时,即使原始操作有属性,代码[1]也不会执行。

    如何找到方法是否只是包装器,而基础方法包含属性,以及如何访问此属性?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Henrik    14 年前

    虽然我确信您可以使用表达式树,但最简单的解决方案是创建一个重载,该重载接受一个methodinfo类型的附加参数,并按如下方式使用:

    
    public static void ProcessStep(Action<bool> action) 
    { 
        ProcessStep(() => action(true), action.Method); //this is only example, don't bother about hardcoded true 
    }
    
        2
  •  0
  •   dalo    14 年前

    好吧,你可以( 我不一定认为这是好的代码… )

    void ProcessStep<T>(T delegateParam, params object[] parameters) where T : class {
        if (!(delegateParam is Delegate)) throw new ArgumentException();
        var del = delegateParam as Delegate;
        // use del.Method here to check the original method
       if (Attribute.IsDefined(del.Method, typeof(LogAttribute)))
       {
           //do something here [1]
       }
       del.DynamicInvoke(parameters);
    }
    
    ProcessStep<Action<bool>>(action, true);
    ProcessStep<Action<string, string>>(action, "Foo", "Bar")
    

    但那不会给你赢得选美比赛。

    如果你能提供更多关于你正在尝试做什么的信息,那就更容易给出有用的建议…(因为这一页上没有一个解决方案看起来很可爱)