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

时间:2011-04-20 08:00:10

标签: c# validation reflection arguments

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

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

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

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

先谢谢你,祝复活节快乐!

5 个答案:

答案 0 :(得分:1)

我认为你正在寻找反思。

Reflection: How to Invoke Method with parameters

答案 1 :(得分:0)

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
    }
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

没有。点。你知道arbument的名字(argName)。你无法知道什么是SET,因为......这甚至不是论证的一部分。它是外部类知识的一部分,而不是参数(将返回argName)。

答案 4 :(得分:0)

不确定这是否是您的想法

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;
}

}