Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.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# 如何在ASP.NET Core中调用类时访问筛选器属性_C#_Asp.net Core_Asp.net Core Mvc - Fatal编程技术网

C# 如何在ASP.NET Core中调用类时访问筛选器属性

C# 如何在ASP.NET Core中调用类时访问筛选器属性,c#,asp.net-core,asp.net-core-mvc,C#,Asp.net Core,Asp.net Core Mvc,是否可以从使用它的类访问筛选器中的属性 我希望能够访问下面筛选器中的客户端属性 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true)] public class ClientAuthenticationAttribute : ActionFilterAttribute, IActionFilter { private ILogger _logger; private

是否可以从使用它的类访问筛选器中的属性

我希望能够访问下面筛选器中的客户端属性

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true)]
public class ClientAuthenticationAttribute : ActionFilterAttribute, IActionFilter
{
    private ILogger _logger;
    private GenericUnitOfWork _worker;
    private bool _authRequired;
    private Client _client;

    public ClientAuthenticationAttribute(bool authRequired = true)
    {
        _authRequired = authRequired;
    }

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        ...

        base.OnActionExecuting(context);
    }

    public bool AuthRequired { get { return _authRequired; } }
    public Client Client { get { return _client; } }
}

我同意卡米洛的观点,这可能不是一个好主意——很容易打破

也就是说,一种方法是过滤器在上下文中删除一个值:

然后可以在以后的任何地方(在同一个请求中)读取它,该位置可以访问HttpContext


这样做的危险在于,如果有人更改过滤器的工作方式,或者完全删除过滤器,那么以后的代码将被破坏——这对任何使用过滤器代码的人来说都不明显。

我同意卡米洛的观点,这可能不是一个好主意——很容易被破坏

也就是说,一种方法是过滤器在上下文中删除一个值:

然后可以在以后的任何地方(在同一个请求中)读取它,该位置可以访问HttpContext


这样做的危险在于,如果任何人更改了过滤器的工作方式,或完全删除了过滤器,则以后的代码将中断—这对于任何使用过滤器代码的人来说都不明显。

使用反射来访问自定义属性。这是一个非常快速的未测试版本,因此请添加适当的空检查、强制转换等

    var props = this.GetProperties();

    foreach (PropertyInfo prop in props) {
        var attrs = prop.GetCustomAttributes(true);

        foreach (object attr in attrs.Where(a => a is ClientAuthenticationAttribute)) {
            var client = ((ClientAuthenticationAttribute)attr).Client;

            // ... do something with client.
        }
    }

由于您可能有多个客户端属性,因此您还需要对这种情况进行一些处理。

使用反射来访问自定义属性。这是一个非常快速的未测试版本,因此请添加适当的空检查、强制转换等

    var props = this.GetProperties();

    foreach (PropertyInfo prop in props) {
        var attrs = prop.GetCustomAttributes(true);

        foreach (object attr in attrs.Where(a => a is ClientAuthenticationAttribute)) {
            var client = ((ClientAuthenticationAttribute)attr).Client;

            // ... do something with client.
        }
    }

由于您可能有多个客户端属性,因此您还需要对这种情况进行一些处理。

筛选器不应该知道它应用于何处,目标不应该知道筛选器存在筛选器不应该知道它应用于何处,目标不应该知道筛选器存在