如何从该属性的getter / setter中获取属性名称?

时间:2010-12-06 09:27:07

标签: c# properties

假设我们有一个属性如下

public string SomeProperty
{
    get
    {
        var propName = "SomeProperty";
        return "<" + propName + ">";
    }
}

如何通过读取程序集信息本身将上述变量propName的值设置为属性名称?

修改

为什么我们需要这个?

我正在使用here中提到的WPF d:DataContext,这将帮助我显示绑定属性的“设计模式”值 - 通常,绑定值显示为空字符串在设计模式。在'design-mode'数据上下文类中,我想返回我可能拥有的每个绑定属性的属性名称。

希望这可以解释您的担忧。

4 个答案:

答案 0 :(得分:10)

过了一会儿,我找到了如下的解决方案,这对我来说非常方便。

    string SomeProperty
    {
        get
        {
            return GetDesignModeValue(() => this.SomeProperty);
        }
    }

    string GetDesignModeValue<T>(Expression<Func<T>> propertyExpression)
    {
        var propName = (propertyExpression.Body as MemberExpression).Member.Name;
        var value = string.Format(
            "<{0}>"
            , propName);
        return value;
    }

因此,从现在开始,在设计模式下显示绑定属性'mocking值要容易得多。

我希望有一天你能发现它有用!

答案 1 :(得分:4)

在运行时没有可靠的方法,但您可以使用MethodBase.GetCurrentMethod().Name并丢弃前四个字符。

这种方法存在一些缺陷:通过混淆工具运行二进制文件可能会导致重命名该方法。此外,该方法可能会内联并导致问题(如果您只是在字符串上使用Remove而不检查长度,它甚至可能导致Release版本中的意外崩溃,这可能很难在调试模式下重现。)< / p>

如果您的代码遵循模式并且您需要生成一堆类似的属性,那么最好使用编译时方法,如代码生成器或面向方面的编程框架。

答案 2 :(得分:1)

这应该也可以,但我不确定你为什么需要这个

public string SomeProperty
    {
        get
        {
            StackTrace st = new StackTrace();
            StackFrame[] fr = st.GetFrames();
            if (fr != null)
            {
                var propName = fr[0].GetMethod().Name.Substring(3, fr[0].GetMethod().Name.Length);
                return "<" + propName + ">";
            }

            return "SomeProperty";

        }
    } 

答案 3 :(得分:-3)

可以将属性的名称传递给getter。

如果 MyObj 是对象,并且 PropName 是包含属性名称的变量,则以下代码正在执行此作业:

eval("Object.defineProperty(MyObj, PropName, { " + 
     "get : function() { return(\"the prop name is " + PropName + "\"); } });");