获取传递给C#方法的参数的名称

获取传递给C#方法的参数的名称,c#,C#,例如,如果我按以下方式调用该方法,我希望得到名称“myFirstParam”和“anotherParam” 也许反思就是答案?也许这是不可能的?我知道存在,但这种解决方案在这里行不通 (请不要回答“这不是一个好主意”。这不是我的问题。)这是完全不可能的 以下是一些根本没有意义的案例: string myFirstParam = "some kind of text"; string anotherParam = 42; MyMethod("test", myFirstParam, another

例如,如果我按以下方式调用该方法,我希望得到名称“myFirstParam”和“anotherParam”

也许反思就是答案?也许这是不可能的?我知道存在,但这种解决方案在这里行不通


(请不要回答“这不是一个好主意”。这不是我的问题。)

这是完全不可能的

以下是一些根本没有意义的案例:

string myFirstParam = "some kind of text";
string anotherParam = 42;
MyMethod("test", myFirstParam, anotherParam);

事实上,局部变量名甚至没有编译到程序集中。

这是不可能的,我想知道您为什么需要它。

除了SLaks的答案之外,在运行时根本没有变量名。变量由堆栈插槽表示,并由索引寻址。因此,即使对于您提供的示例,您也无法获得这些信息,更不用说提供的所有示例了。反思在这里没有帮助。什么都不是。

我向死者提出这个问题

查看C#6.0的新名称()操作符。它允许你做你想做的事情,实际上这并不总是一个坏主意

一个好的用例是参数异常,或者INotifyPropertyChanged。(特别是当您在混合中获得继承时)

例如:

MyMethod("abc", new object[5]);
MyMethod("abc", "def");
MyMethod("abc", var1 + var2);
MyMethod("abc", SomeMethod());
MyMethod("abc", b ? a : c);
MyMethod("abc", new object()); 
MyMethod("abc", null);
现在,如果在接口IFooBar中重命名方法“Foo”上的参数“bar”,参数异常将相应更新(防止忘记更改“bar”字符串)

实际上相当整洁

这个怎么样

interface IFooBar
{
    void Foo(object bar);
}

public class FooBar : IFooBar
{


    public void Foo(object bar)
    {
        if(bar == null)
        {
            //Old and Busted
            //throw new ArgumentException("bar");

            //The new HOTNESS
            throw new ArgumentException(nameof(bar)); // nameof(bar) returns "bar"

        }

        //....
    }

}
这已经在System.Web.MVC.Html InputExtension中实现

我受到启发,在我的代码中使用了这种技术。 它非常灵活

不要为助手方法中的“Html”命名而烦恼。在helper方法中与html或html属性无关


它只是将命名的匿名参数转换为RouteValueDictionary,这是一种特殊的字典,具有
IDictionary
接口,其中key保存参数名称,object是参数的值。

使用反射和@Martin的空参数测试示例:

void MyMethod(string something, object parameters)
{
RouteValueDictionary dic = HtmlHelper.AnonymousObjectToHtmlAttributes(options);
}

MyMethod("test", new { @myFirstParam=""some kind of text", anotherParam=42);
访问参数名称:

using System.Reflection;

public SomeMethod(ClassA a, ClassB b, ClassC c)
{
    CheckNullParams(MethodBase.GetCurrentMethod(), a, b, c);
    // do something here
}
public void CheckNullParams(MethodBase方法,params对象[]args)
{
对于(var i=0;i
这适用于构造函数和公共方法,但我还没有在VS中进行过单元测试以外的测试,因此可能存在一些运行时JIT问题(阅读上面提到的文章)


编辑:刚刚注意到,这基本上与相同。

但在其他情况下,如果实际传递了一个参数,它会工作吗?使用反射?@Richard:不;这不是反射所做的。你需要一个反编译器和一个符号文件。哦,对了,我忘了。您可以获取方法名等,但实际上并不能像反编译一样获取参数等的符号。感谢您的澄清。:-)非常感谢(你们大家)。我知道这在很多情况下是没有意义的,但我一直在寻找一个结论性的答案,那就是这根本不可能,因为信息不存在。谢谢。我迫不及待想知道你会如何处理这些信息。好的,我会给你应得的笑声。我只是想改进一下数据库更新包装器方法的语法,其中C#中的参数名将是SQL命令中使用的参数名如果您想像MVC一样使用匿名类型。查看一些简单的代码,使其工作。整洁-然后我将能够使用反射来获取属性名称。很不错的。谢谢,然后呢!我将使用dynamic object的方法,不必为每个“sql命令”编写新方法,这样您就可以只编写dbWrapper.whateverMethod(new{param1='foo',param2='bar'}),并能够获取您要调用的存储过程“whateverMethod”,这很有帮助,它只是以一种类型安全的方式将变量名传递给函数——它不允许函数返回并从调用它的函数获取变量名。无法执行此操作的原因尚未更改。您可以将参数的名称作为。。。参数但最初的问题是如何获取调用方法使用的变量的名称
nameof
de不添加任何新功能,它只允许您在一个字符串中使用一个变量(您可以在示例中使用
throw new ArgumentException(“bar”)执行相同的操作)是的,这不是我想要的。但是谢谢你,这也是一个非常酷的特性。正如前面所说的,这并没有得到传入变量的名称,只有param变量本身的名称…与所问的问题完全无关。问题是问这个:给定
myMethod(paramName1,paramName2)
myMethod(params对象[]myParams)中的
如何获取
paramName1
paramName2
,我们不关心
myParams
的名称,这当然有一个很好的理由……例如,我试图创建一个通用的SQL过程读取/绑定方法,按照惯例,如果我能找到na,C#vars将与过程参数具有相同的名称对于传入的参数,我可以很容易地创建我的
SqlParameter
s,但是现在我必须调用proc 2x,首先获取参数名,然后实际获取我需要的数据。。。
using System.Reflection;

public SomeMethod(ClassA a, ClassB b, ClassC c)
{
    CheckNullParams(MethodBase.GetCurrentMethod(), a, b, c);
    // do something here
}
public void CheckNullParams(MethodBase method, params object[] args)
{
    for (var i=0; i < args.Count(); i++)
    {
        if (args[i] == null)
        {
            throw new ArgumentNullException(method.GetParameters()[i].Name);
        }
    }
}