在c#中是否可以从参数值中检索参数名?

本文关键字:参数 检索 是否 | 更新日期: 2023-09-27 17:50:43

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

Requires.StringNotNullOrEmpty(string argName, string argValue) {...}

要验证参数,必须提供参数的名称(稍后用于抛出有意义的ArgumentException)及其值。

我的问题是,是否有一种方法可以从方法体内的参数值检索参数名称?

提前感谢,复活节快乐!

在c#中是否可以从参数值中检索参数名?

我想你是在找Reflection

反射:如何调用带参数的方法

class A
{
    public void MyMethod(int num, string aString)
    { 
        ParameterInfo[] parameters = typeof(A).GetMethod("MyMethod", BindingFlags.Public|BindingFlags.Instance).GetParameters();
        string secondParameterName = parameters[1].Name;   //you will get aString
    }
}

不,你不能知道调用代码使用的名称——因为在很多情况下,传递给你的方法根本没有名称,例如,它可能是一个表达式,或者一个文字。所以这个没有通解

No。点。你知道arbument的名字(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;
}

}