Получить передаваемое имя параметра

хочу реализовать метод, проверяющий переданный параметр на null. В случае, если параметр равен null, то кидаю исключение. Так вот, в этом исключении хотелось бы видеть название данного параметра (т.е. название непосредственно из самого вызова метода). Сейчас идея такая:

Вызов проверки:

        ArgumentChecker.CheckNullArgument(() => nickname);
        ArgumentChecker.CheckNullArgument(() => role);
        ArgumentChecker.CheckNullArgument(() => hashPassword);

Метод для проверки:

    public void CheckNullArgument<T>(Func<T> argumentFunc)
        where T : class
    {
        T value = argumentFunc();

        if (value is null)
        {
            var name = argumentFunc.Method
                .ReflectedType
                .GetRuntimeFields()
                .First()
                .Name;

            exceptionManager.NullArgument(name);
        }
    }

При такой реализации argumentFunc всегда имеет Target со всеми именами параметров (в вызывающем методе они также переданы в виде параметров), из-за чего я всегда получаю имя первого параметра.

Target

В общем, хотелось бы увидеть более лаконичное решение этой задачи


Ответы (1 шт):

Автор решения: Alexander Petrov
using System.Linq.Expressions;
public void CheckNullArgument<T>(Expression<Func<T>> argumentFunc)
    where T : class
{
    T value = argumentFunc.Compile()();

    if (value is null)
    {
        var expressionBody = (MemberExpression)argumentFunc.Body;
        string name = expressionBody.Member.Name;
        exceptionManager.NullArgument(name);
    }
}
→ Ссылка