C# 如何获取传递给方法的参数的名称?

C# 如何获取传递给方法的参数的名称?,c#,.net-core,C#,.net Core,我目前有一个验证类,其中包含一个方法,该方法验证字符串是否为null(并记录信息,但这不是本文关注的问题) 这叫做使用 ValidateStringNotEmpty(nameof(Name), Name); 是否有一种简单(且经过优化)的方法来防止需要传递第一个参数nameof(property) 我看到了使用stacktrace跟踪回拨的解决方案,但这似乎不是一个很好的解决方案 编辑:我真正想做的是看看是否存在这样做的东西(不需要传递参数的名称)。我知道实用的解决方案是我已经使用过的,这不是

我目前有一个验证类,其中包含一个方法,该方法验证字符串是否为null(并记录信息,但这不是本文关注的问题)

这叫做使用

ValidateStringNotEmpty(nameof(Name), Name);
是否有一种简单(且经过优化)的方法来防止需要传递第一个参数
nameof(property)

我看到了使用stacktrace跟踪回拨的解决方案,但这似乎不是一个很好的解决方案


编辑:我真正想做的是看看是否存在这样做的东西(不需要传递参数的名称)。我知道实用的解决方案是我已经使用过的,这不是问题。

直接在属性内部验证并利用
[CallerMemberName]
怎么样

private string _text;

public string Text
{
    get => _text;
    set
    {
        if (IsValid(value))
        {
            _text = value;
        }
        else
        {
            ValidationErrors.Add("'abcd' was expected.");
        }
    }
}

private bool IsValid<T>(T value, [CallerMemberName] string propertyName = null)
{
    switch (propertyName)
    {
        case nameof(Text):
            return value as string == "abcd";
        default:
            throw new ArgumentOutOfRangeException(nameof(propertyName), propertyName, null);
    }
}

public static class ValidationErrors
{
    public static void Add(string message, [CallerMemberName] string propertyName = null)
    {
        throw new NotImplementedException();
    }
}
私有字符串\u文本;
公共字符串文本
{
获取=>\u文本;
设置
{
如果(IsValid(值))
{
_文本=值;
}
其他的
{
添加(“'abcd'应为“);
}
}
}
私有bool有效(T值,[CallerMemberName]字符串propertyName=null)
{
交换机(propertyName)
{
案例名称(文本):
返回字符串形式的值==“abcd”;
违约:
抛出新ArgumentOutOfRangeException(nameof(propertyName),propertyName,null);
}
}
公共静态类验证错误
{
公共静态void Add(字符串消息,[CallerMemberName]字符串属性名称=null)
{
抛出新的NotImplementedException();
}
}

这是否回答了您的问题?这就是他们要问的问题吗?你可以将表达式树与lambda表达式一起使用,但它们很脆弱,一点也不“容易”。@OrelEraki我想公认的答案可能有效,但似乎有点过火(我只是尝试只需要传递一个参数,这个解决方案似乎很重!),而这个解决方案是elegent,我不想在每次值更改时触发验证,只在调用它时触发。谢谢(顺便说一句,下一票不是我的。)我不知道您是否在使用WPF,但它只允许在控件失去焦点时触发验证,而不是在属性发生更改时触发验证:。不,它位于简单类库中,没有指向GUI的链接或其他设置无效值的内容,然后设置有效值,没有清除验证错误。这只是一个示例,当然在实际中还有很多事情要做。
private string _text;

public string Text
{
    get => _text;
    set
    {
        if (IsValid(value))
        {
            _text = value;
        }
        else
        {
            ValidationErrors.Add("'abcd' was expected.");
        }
    }
}

private bool IsValid<T>(T value, [CallerMemberName] string propertyName = null)
{
    switch (propertyName)
    {
        case nameof(Text):
            return value as string == "abcd";
        default:
            throw new ArgumentOutOfRangeException(nameof(propertyName), propertyName, null);
    }
}

public static class ValidationErrors
{
    public static void Add(string message, [CallerMemberName] string propertyName = null)
    {
        throw new NotImplementedException();
    }
}