是否可以从C#中的参数值检索参数名称?

是否可以从C#中的参数值检索参数名称?,c#,validation,reflection,arguments,C#,Validation,Reflection,Arguments,我想知道是否可以从参数值中检索参数名称。我需要这个功能,因为我自己构建了一个静态类(称为Requires),使方法体中的参数检查成为一个单行程序。目前,验证方法的实现方式如下: Requires.StringNotNullOrEmpty(string argName, string argValue) {...} 要验证参数,必须提供参数的名称(稍后用于引发有意义的ArgumentException)及其值 我的问题是,有没有办法从方法体中的参数值检索参数名称 提前谢谢,复活节快乐 我认为你在

我想知道是否可以从参数值中检索参数名称。我需要这个功能,因为我自己构建了一个静态类(称为Requires),使方法体中的参数检查成为一个单行程序。目前,验证方法的实现方式如下:

Requires.StringNotNullOrEmpty(string argName, string argValue) {...}
要验证参数,必须提供参数的名称(稍后用于引发有意义的ArgumentException)及其值

我的问题是,有没有办法从方法体中的参数值检索参数名称


提前谢谢,复活节快乐

我认为你在寻找反思


我想你是在寻找反思


否,您无法知道调用代码使用的名称-因为在许多情况下,传递给方法的内容根本没有名称,例如,它可能是表达式或文本。因此没有通用的解决方案。

不,您无法知道调用代码使用的名称-因为在许多情况下,传递给方法的内容根本没有名称,例如,它可能是表达式或文字。所以这个问题没有通用的解决方案。您知道仲裁的名称(argName)。你不知道是从什么开始的,因为。。。这甚至不是争论的一部分。它是外部类知识的一部分,而不是参数(它将返回argName)。

No.Point。您知道仲裁的名称(argName)。你不知道是从什么开始的,因为。。。这甚至不是争论的一部分。它是外部类知识的一部分,而不是参数(将返回argName)。

不确定这是否是您的想法

internal class TestClass
{

private void DoSomething(string myArg)
{
    // returns the name of the argument = "myArg"
    string myArgName = GetArgumentName(() => myArg);
    // check
    System.Diagnostics.Debug.Assert(string.Compare("myArg", myArgName, System.StringComparison.InvariantCulture) == 0, "names do not match");
}


private static string GetArgumentName<T>(System.Linq.Expressions.Expression<System.Func<T>> argument)
{
    string argumentName = null;
    System.Linq.Expressions.MemberExpression body = (System.Linq.Expressions.MemberExpression)argument.Body;
    if (body.Member != null)
    {
        argumentName = body.Member.Name;
    }

    if (argumentName == null)
    {
        // could not retrieve argument name
    }

    return argumentName;
}
内部类TestClass
{
私有void DoSomething(字符串myArg)
{
//返回参数的名称=“myArg”
字符串myArgName=GetArgumentName(()=>myArg);
//检查
System.Diagnostics.Debug.Assert(string.Compare(“myArg”,myArgName,System.StringComparison.InvariantCulture)=0,“名称不匹配”);
}
私有静态字符串GetArgumentName(System.Linq.Expressions.Expression参数)
{
字符串argumentName=null;
System.Linq.Expressions.MemberExpression body=(System.Linq.Expressions.MemberExpression)argument.body;
if(body.Member!=null)
{
argumentName=body.Member.Name;
}
if(argumentName==null)
{
//无法检索参数名称
}
返回参数名;
}

}

不确定这是否是您的想法

internal class TestClass
{

private void DoSomething(string myArg)
{
    // returns the name of the argument = "myArg"
    string myArgName = GetArgumentName(() => myArg);
    // check
    System.Diagnostics.Debug.Assert(string.Compare("myArg", myArgName, System.StringComparison.InvariantCulture) == 0, "names do not match");
}


private static string GetArgumentName<T>(System.Linq.Expressions.Expression<System.Func<T>> argument)
{
    string argumentName = null;
    System.Linq.Expressions.MemberExpression body = (System.Linq.Expressions.MemberExpression)argument.Body;
    if (body.Member != null)
    {
        argumentName = body.Member.Name;
    }

    if (argumentName == null)
    {
        // could not retrieve argument name
    }

    return argumentName;
}
内部类TestClass
{
私有void DoSomething(字符串myArg)
{
//返回参数的名称=“myArg”
字符串myArgName=GetArgumentName(()=>myArg);
//检查
System.Diagnostics.Debug.Assert(string.Compare(“myArg”,myArgName,System.StringComparison.InvariantCulture)=0,“名称不匹配”);
}
私有静态字符串GetArgumentName(System.Linq.Expressions.Expression参数)
{
字符串argumentName=null;
System.Linq.Expressions.MemberExpression body=(System.Linq.Expressions.MemberExpression)argument.body;
if(body.Member!=null)
{
argumentName=body.Member.Name;
}
if(argumentName==null)
{
//无法检索参数名称
}
返回参数名;
}

}

可能。。。但是,您的方法不一定知道是哪一种。所以,你必须告诉它你在说哪一个。现在,你只需要一步就可以像你的例子中那样直接告诉它名字。你看过微软研究院的代码合同吗?看起来很像你所描述的。很可能。。。但是,您的方法不一定知道是哪一种。所以,你必须告诉它你在说哪一个。现在,你只需要一步就可以像你的例子中那样直接告诉它名字。你看过微软研究院的代码合同吗?它看起来很像您所描述的。这将用硬接线方法名称替换硬接线参数名称-费用也很大。这将用硬接线方法名称替换硬接线参数名称-费用也很大。