假设我们有一个属性如下
public string SomeProperty
{
get
{
var propName = "SomeProperty";
return "<" + propName + ">";
}
}
如何通过读取程序集信息本身将上述变量propName
的值设置为属性名称?
修改
为什么我们需要这个?
我正在使用here中提到的WPF d:DataContext
,这将帮助我显示绑定属性的“设计模式”值 - 通常,绑定值显示为空字符串在设计模式。在'design-mode'数据上下文类中,我想返回我可能拥有的每个绑定属性的属性名称。
希望这可以解释您的担忧。
答案 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 + "\"); } });");