我想知道我是否可以从参数值检索参数名称。我需要这个功能,因为我已经为自己构建了一个静态类(称为require),使方法体中的参数检查成为一行代码。目前,验证方法是这样实现的:
Requires.StringNotNullOrEmpty(string argName, string argValue) {...}
要验证参数,必须提供参数的名称(稍后用于抛出有意义的ArgumentException)及其值。
我的问题是,是否有一种方法可以从方法体内的参数值检索参数名称?
提前感谢,复活节快乐!
我想你是在找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;
}
}