Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:如何在调用触发事件的方法时创建该方法的属性?_C#_.net_Events_Methods_Attributes - Fatal编程技术网

C#:如何在调用触发事件的方法时创建该方法的属性?

C#:如何在调用触发事件的方法时创建该方法的属性?,c#,.net,events,methods,attributes,C#,.net,Events,Methods,Attributes,在C#或.NET中,是否有一种方法可以在调用方法时触发事件的方法上创建属性?理想情况下,我能够在调用方法之前和之后运行自定义操作 我的意思是这样的: [TriggersMyCustomAction()] public void DoSomeStuff() { } 我完全不知道如何做,或者如果可能的话,但我可能会在后台做类似的事情。不过我不确定 编辑:我忘了提到,由于我的具体情况,绩效不是一个真正的问题。我知道如何做到这一点的唯一方法是使用。它对你的IL进行后期处理,并可以做你要求的事情。我不认

在C#或.NET中,是否有一种方法可以在调用方法时触发事件的方法上创建属性?理想情况下,我能够在调用方法之前和之后运行自定义操作

我的意思是这样的:

[TriggersMyCustomAction()]
public void DoSomeStuff()
{
}
我完全不知道如何做,或者如果可能的话,但我可能会在后台做类似的事情。不过我不确定


编辑:我忘了提到,由于我的具体情况,绩效不是一个真正的问题。

我知道如何做到这一点的唯一方法是使用。它对你的IL进行后期处理,并可以做你要求的事情。

我不认为只有一个属性就可以做到这一点,但是通过使用和反射,你可以拥有一个知道截取你拥有属性化方法的类的实例化的类


然后,只要调用属性化方法,代理类就可以触发事件。

属性提供信息,它们是元数据。我不知道有什么方法可以马上做,也许有人会

您可以查看.NET中的部分方法,这些方法允许您执行一些轻量级事件处理。您提供钩子并让其他人处理实现。如果该方法没有实现,编译器就会忽略它


您需要某种面向方面的框架。波斯夏普会做的,我也会

基本上,它们是对象的子类并覆盖此方法

然后它变成:

//proxy
public override void DoSomeStuff()
{
     if(MethodHasTriggerAttribute)
        Trigger();

     _innerClass.DoSomeStuff();
}

当然,这一切对你来说都是隐藏的。你所要做的就是向温莎索要类型,它会为你做代理。我认为在温莎,该属性变成了一个(自定义)功能。

您可以使用ContextBoundObject和IMessageSink。看

请注意,与直接方法调用相比,此方法对性能有严重影响。

此概念用于web应用程序。

.NET Framework 4.x提供了几个触发操作的属性,例如:
ExceptionFilterAttribute
(处理异常)、
AuthorizeAttribute
(处理授权)。两者都在
System.Web.Http.Filters
中定义

例如,您可以定义自己的授权属性,如下所示:

公共类myAuthorizationAttribute:AuthorizationAttribute
{
受保护的覆盖布尔已授权(HttpActionContext actionContext)
{
//这里有什么事吗
//它将在调用修饰的方法时被调用
if(检查授权(actionContext))
返回true;//已授权
其他的
返回false;//未授权
}
}
然后,在您的控制器类中,您将使用授权的方法修饰如下:

[myAuthorization]
公共HttpResponseMessage Post(字符串id)
{
//…你的密码在这里
response=newhttpresponsemessage(HttpStatusCode.OK);//返回OK状态
返回响应;
}
每当调用
Post
方法时,在执行
Post
方法中的代码之前,它将调用
myAuthorization
属性中的
IsAuthorized
方法

如果在
IsAuthorized
方法中返回
false
,则表示未授予授权,并且方法
Post
的执行中止


为了理解这是如何工作的,让我们看一个不同的例子:
异常过滤器
,它允许通过使用属性过滤异常,其用法类似于上面所示的
授权属性
(您可以找到关于其用法的更详细描述)

要使用它,请从
ExceptionFilterAttribute
派生
DivideByZeroExceptionFilter
类,如图所示,并重写方法
OneException

公共类除以ZeroExceptionFilter:ExceptionFilterAttribute
{
public override void OneException(HttpActionExecuteContext ActionExecuteContext)
{
如果(actionExecutedContext.Exception被零异常除掉)
{
actionExecutedContext.Response=新的HttpResponseMessage(){
Content=new-StringContent(“应用程序中发生了一个DIV错误。”,
System.Text.Encoding.UTF8,“文本/普通”),
StatusCode=System.Net.HttpStatusCode.InternalServerError
};
}
}
}
然后使用以下演示代码触发它:

[DivideByZeroExceptionFilter]
公共无效删除(int-id)
{
//只是为了演示,它
//导致触发DivideByZeroExceptionFilter属性:
抛出新的DivideByZeroException();
//(通常,这里有一些代码可能会抛出
//如果出现问题,并且您希望
//确保在这种情况下正确中止)
}
现在我们知道了它是如何使用的,我们主要对实现感兴趣。以下代码来自.NET Framework。它在内部将接口
IEExceptionFilter
用作合同:

namespace System.Web.Http.Filters
{
公共接口IEExceptionFilter:IFilter
{
//执行异步异常筛选器。
//返回:异步异常筛选器。
任务ExecuteExceptionFilterAsync(
HttpActionExecuteContext操作ExecuteContext,
取消令牌取消令牌);
}
}
ExceptionFilterAttribute
本身的定义如下:

namespace System.Web.Http.Filters
{
//表示异常筛选器的属性。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,
继承=真,Allo