获取属性名称C#

时间:2015-06-26 15:32:02

标签: c#

我有一个班级:

class Sample
{  
   ...
}

并定义如下属性:

Sample sampleParam =new Sample(...);

并有一个功能:

private void Func(Sample s)
{}

并使用它:

Func(sampleParam);

我可以得到'功能中的名字?我的意思是我能得到"sampleParam"(param的名字)吗?

听起来很奇怪;但我需要传递的参数的名称。

抱歉这种要求;我只想问我的问题尽可能简单

5 个答案:

答案 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