【问题标题】:C# Custom attribute for handling null case用于处理 null 情况的 C# 自定义属性
【发布时间】:2022-01-22 09:40:10
【问题描述】:

我有几种方法总是检查“用户”类型的参数中的空值。 我不想多次编写这种模式,而是想利用 C# 属性。

public bool HasPendingBasket(User user)
{
    if (user == null)
    {
        return false;
    }

    // Code ..

}

public void AddUser(User user)
{
    if (user == null)
    {
        return;
    }

    // Code ..

}

// Many more methods like above

我想知道是否可以这样写:

public bool HasPendingBasket([NotNullReturn(false)] User user)

public void AddUser([NotNullReturn(null)] User user)

// Or 

[NotNullReturn(false)]
public bool HasPendingBasket(User user)

[NotNullReturn(null)]
public void AddUser(User user)

我阅读了 Microsoft 文档,他们提到了

但是,您创建的任何属性仅充当元数据,并且不会导致属性类中的任何代码被执行。您可以在代码中的其他位置对元数据采取行动(本教程稍后会详细介绍)。

Here

所以听起来属性不能做我正在寻找的东西,因为它只充当元数据。 不知我的理解是否正确。

如果是正确的,是否有更好的方法来进行空检查,而不必在任何地方编写该模式?

【问题讨论】:

  • 你的理解是正确的。这些属性适用于代码分析器。
  • 您使用的是什么版本的 .NET/C#?如果 .NET Core 3.1 和 C# 8 或更高版本使用可空支持:编译器会在传递可能为空或不可为空的内容时向您发出警告。

标签: c# .net attributes notnull


【解决方案1】:

您正在寻找一种称为面向方面编程 (AOP) 的范式,特别是拦截器模式。

如果您使用autofac 作为您的依赖注入容器,那么您将“免费”获得它。 Autofac documentation

不过,这在底层使用了Castle DynamicProxy,因此您可以使用内置容器自行开发。编写代理处理程序来拦截并检查拦截的类/方法上的任何属性。 Castle documentation

【讨论】:

  • 这听起来很复杂,但我得看看
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
相关资源
最近更新 更多