我正在使用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" );
}
}
或者,我将接受另一个解决方案,该解决方案使参数检查变得简洁明了。
想法?
答案 0 :(得分:0)
还没有人给出答案,但是评论中提到了替代方法:
虽然没有回答具体问题,但确实回答了一种更简单的处理空类型的方法的意图。考虑到我的问题已经回答。