我有一个班级:
class Sample
{
...
}
并定义如下属性:
Sample sampleParam =new Sample(...);
并有一个功能:
private void Func(Sample s)
{}
并使用它:
Func(sampleParam);
我可以得到'功能中的名字?我的意思是我能得到"sampleParam"
(param的名字)吗?
听起来很奇怪;但我需要传递的参数的名称。
抱歉这种要求;我只想问我的问题尽可能简单
答案 0 :(得分:1)
你应该从不引用被调用方法中的变量或属性名称 - 它的不礼貌和糟糕的设计(主要是后者)。
C#6.0中有nameof
个运算符,但它并非为此设计。
您可以使用表达式树,这会稍微改变您的语法。如果sampleParam
不是属性而是变量,则无法真正访问它,因为编译器不会在生成时存储对该名称的任何引用dll文件。
答案 1 :(得分:1)
public string GetParamName(System.Reflection.MethodInfo method,int index)
{
string strParameterName = string.Empty;
if (method != null && method.GetParameters().Length > index)
strParameterName = method.GetParameters()[index].Name;
return retVal;
}
是的,通过反思 ...
可以实现这一目标答案 2 :(得分:0)
我认为不可能获得将值传递给方法的变量的名称。但是如果没有指定,编译器服务CallerMemberNameAttribute
会将调用方法的名称(这里是我们的属性get
的{{1}}访问器)复制到调用方法:
Name
打印:
class Person {
static void Main(string[] args) {
Person bart = new Person();
bart.Name = "Bart";
Console.ReadKey();
}
private string _name;
public string Name {
get {
return _name;
} set {
_name = value;
PropertyChanged(); //no need to fill in `Name` here! :)
}
}
//automatically copy caller's name to `propertyName`, at compile time
private void PropertyChanged([CallerMemberName] string propertyName = "") {
object propertyValue = this.GetType().GetProperty(propertyName).GetValue(this);
Console.WriteLine("Property '" + propertyName + "' changed the value to '" + propertyValue + "'");
}
}
答案 3 :(得分:0)
这不是你要求的,但可能更接近你想要的,但你可以看一下System.Environment.StackTrace。
答案 4 :(得分:0)
如果你的意思是你能得到名称' sampleParam'来自INSIDE func?答案是否定的。在C#6.0中有nameof()但是' sampleParam'里面不在func里面。变量s(类型为Sample)被装箱并赋予ref to sampleParam。
你可以得到这个名字" s"在Func里面。 您可以获得名称" sampleParam"在调用类中(在Func之外)。
Example (available on dotnetfiddle)
using System;
public class Program
{
public static Sample sampleParam {get; set;} =new Sample();
public static void Main()
{
Console.WriteLine($"Name of property: {nameof(sampleParam)}");
Func(sampleParam);
}
private static void Func(Sample s)
{
Console.Write($"Name of parameter: {nameof(s)}");
}
}
public class Sample
{
}
输出:
Name of property: sampleParam
Name of parameter: s
现在这是一个相当简单的例子。 Func与sampleParam存在于同一个类中,并且只有一个属性,因此可以派生出名称,但我的假设是尽管你的问题说明了这种方式,你正在寻找更通用的解决方案。问题是在func内部,调用参数名称不在范围内。您可以通过调用方法中的nameof捕获它并将其传递给func但是由于各种原因,您不应该这是一个可怕的代码。
如上所述,您正在做的是故意构建脆弱的紧密耦合代码,这是开发人员非常难以预防的事情。调用者不会知道传递给func的参数的名称是重要的,不应该。这让我相信这是xy problem。