Наиболее кратким и понятным решением будет то, что у вас есть, или C # 7 Бросающее выражение
param1 = param1 ?? throw new ArgumentNullException(nameof(param1));
Вы можете использовать Выражения и некоторые смарты, хотя я бы не рекомендовал это , оно пахнет и скрывает простую логику за абстракцией и издержками .Кроме того, он опирается на неопределенное поведение , которое может измениться в будущем
Тем не менее, помимо всего этого, я даю вам выражений
public static class Validator
{
public static void Validate<T>(Expression<Func<string, T>> f)
{
var name = (f.Body as MemberExpression).Member.Name;
if(f.Compile().Invoke(name) == null)
throw new ArgumentNullException(name);
}
}
Причина, по которой это работает, заключается в том, что компилятор генерирует класс для лямбда-выражения (замыкание), а локальная переменная становится свойством Member.Name
, что означает, что оно также должно работать и для свойств (не проверено)
Использование
public static void Test(string param1, string param2)
{
Validator.Validate(x => param1);
}
public static void Main()
{
Test(null,"asdf");
}
Выход
Значение не может быть нулевым.Имя параметра: param1
Примечание : По правде говоря, я не слишком много думал об этом или проверял его больше, чем пару случаев, он может или не может бытьработать, поэтому я не несу ответственности за людей, которым вы наносите вред этим кодом