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);
}
}