我想知道我是否可以从参数值中检索参数名称。我需要这个功能,因为我自己构建了一个静态类(称为Requires),使方法体中的参数检查成为一个单行。目前,验证方法的实现方式如下:
Requires.StringNotNullOrEmpty(string argName, string argValue) {...}
要验证参数,您必须提供参数的名称(稍后用于抛出有意义的ArgumentException)及其值。
我的问题是,有没有办法从方法体内的参数值中检索参数名?
先谢谢你,祝复活节快乐!
答案 0 :(得分:1)
我认为你正在寻找反思。
答案 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;
}
}