有没有一种方法来获取函数参数的名称(而不是参数)?

时间:2019-10-10 19:15:39

标签: c# reflection

我正在使用C#7+,并且我知道[CallerMemberName]属性,但是我要寻找的是一个可以让我获得参数名称的属性。

用例:即使使用???空运算符来检查空值,对于条件检查和使用适当的值抛出适当的异常也可能有点乏味。几个月以来,我一直在使用一种解决方案,该解决方案受到我阅读的某些文章的启发,并且可以称为“参数验证构建器”。会使用类似这样的东西:

public class MyClass
{
    public void DoTheThing(IFoo foo, ICollection<IBar> bars, string specialText)
    {
        new ArgumentValidator()
            .NotNull(foo, nameof(foo))
            .NotNullOrEmpty(bars, nameof(bars))
            .NotNullOrEmpty(specialText, nameof(specialText));

        ...rest of function
    }
}

例如,如果foo为空,则ArgumentValidator.NotNull(...)将抛出一个新的ArgumentNullException,其参数名为“ foo”。这种方法使参数检查更加简洁,这几乎就是我这样做的唯一原因。

如果我不必每次都指定nameof(...),那就太好了。也就是说,我希望能够做到这一点:

        new ArgumentValidator()
            .NotNull(foo)
            .NotNullOrEmpty(bars)
            .NotNullOrEmpty(specialText);

尽管如此,我需要弄清楚如何使NotNull(...)和其他函数找出参数的名称。

我尝试制作一个基于参数的属性,我尝试查看Environment.StackTrace(不为尝试解析该内容而感到兴奋,也没有涉及性能影响),我查看了StackFrame ,我查看了有关类的类信息->方法信息->参数信息和自定义属性,但我仍然没有找到前进的方向。

我想创建一个类似于[CallerMemberName]的属性,但是此属性将提取用于调用该函数的参数的名称,将其分配给修饰的参数,并会快速执行(在换句话说,如果可能的话,我想避免使用堆栈跟踪,尤其是因为我经常使用这些检查。)

我在这里:

[AttributeUsage( AttributeTargets.Parameter )]
class ArgumentNameAttribute : Attribute
{
    public string SomeProperty { get; set; }
}

class Program
{
    static void NotNull<T>( T argument, [ArgumentNameAttribute] string argumentName )
    {
        //how to get at the argumentName?
    }

    static void DoTheThing( string thing )
    {
        NotNull( thing );
        Console.WriteLine( "hello world" );
    }

    static void Main( string[] args )
    {
        DoTheThing( "12345" );
    }
}

或者,我将接受另一个解决方案,该解决方案使参数检查变得简洁明了。

想法?

1 个答案:

答案 0 :(得分:0)

还没有人给出答案,但是评论中提到了替代方法:

  • 面向方面的编程(AOP)
  • 使用C#8的可为空的引用类型语法

虽然没有回答具体问题,但确实回答了一种更简单的处理空类型的方法的意图。考虑到我的问题已经回答。