C# 如何从自定义属性中找到修饰的方法?

C# 如何从自定义属性中找到修饰的方法?,c#,.net,asp.net-mvc,C#,.net,Asp.net Mvc,我需要根据控制器中的特定方法进行一些自定义授权。自定义属性是否可以知道正在调用哪个方法 鉴于以下情况: [CustomAttribute] public ActionResult Index() { //some stuff } [CustomAttribute]是否可能知道专门调用的索引?这同样适用于用[CustomAttribute]修饰的任何其他方法。在MVC控制器中,方法称为操作 通过让属性从ActionFilterAttribute继承,可以确定从属性内部调用了哪个操作。然后

我需要根据控制器中的特定方法进行一些自定义授权。自定义属性是否可以知道正在调用哪个方法

鉴于以下情况:

[CustomAttribute]
public ActionResult Index()
{
    //some stuff
}

[CustomAttribute]是否可能知道专门调用的索引?这同样适用于用[CustomAttribute]修饰的任何其他方法。

在MVC控制器中,方法称为操作

通过让属性从ActionFilterAttribute继承,可以确定从属性内部调用了哪个操作。然后重写OnActionExecuting方法(或OnActionExecuted)。filterContext(ActionExecutingContext)参数有一个名为ActionDescriptor的属性。您可以从ActionName属性获取操作名称

var actionName = filterContext.ActionDescriptor.ActionName

我不确定我是否完全理解你的问题,但我会尽力回答。属性用于标记方法或类。把它想象成一个标签。它不是一个具有行为的实例,您不能在属性内部做出决策。您应该使用属性注释在方法中做出决策,而不是相反

由于您希望做出自定义授权决策,因此我建议使用。在这里,您可以使用当前索引方法的属性来进行自定义决策。我将使用反射获取正在执行的操作或控制器,使用以下语句:

string actionName = this.ControllerContext.RouteData.Values["action"];
string controllerName = this.ControllerContext.RouteData.Values["controller"];
然后,使用反射还可以检索特定类和方法的信息,并检查装饰各个对象的属性。可以解释如何访问特定方法的属性


希望我能帮忙

自定义属性是附加到代码实体(属性、方法、字段等)的静态信息。所以,你所需要的是不可能的

让“某人”知道某事正在发生的标准方法是使用事件。如果它们涉及整个类型而不仅仅是一个实例,那么它们可以是静态的

首先定义EventArgs类:

public class IndexCalledEventArgs : EventArgs
{
    public IndexCalledEventArgs(int index)
    {
        Index = index;
    }

    public int Index { get; private set; }
}
必须观察其索引的类定义静态事件,并在访问索引时激发它:

public class MyClass
{
    public static event EventHandler<IndexCalledEventArgs> IndexCalled;

    public ActionResult Index()
    {
        int index;

        // Somehow get an index
        index = 7;
        OnIndexCalled(this, index);

        return new ActionResult { Index = index };
    }

    private static void OnIndexCalled(MyClass sender, int index)
    {
        var handler = IndexCalled;
        if (handler != null) {
            // Create the event args and fire the event.
            handler(sender, new IndexCalledEventArgs(index));
        }
    }
}
public class InteresedInIndexCalledEvent
{
    public InteresedInIndexCalledEvent()
    {
        MyClass.IndexCalled += MyClass_IndexCalled;
    }

    void MyClass_IndexCalled(object sender, IndexCalledEventArgs e)
    {
        Console.WriteLine("Index {0} was called", e.Index);
    }
}