如何从该属性的getter/setter中获取属性名称?
问题描述:
比方说,我们有一个属性如下如何从该属性的getter/setter中获取属性名称?
public string SomeProperty
{
get
{
var propName = "SomeProperty";
return "<" + propName + ">";
}
}
如何我可以从组件信息本身读取设置上述变量propName
是属性名的值?
编辑
为什么我们需要这个?
我使用WPF d:DataContext
,如here中所述,这将帮助我为绑定属性显示“设计模式”值 - 通常,绑定值在设计模式下显示为空字符串。而在'设计模式'的数据上下文类中,我想返回属性名称来表示每个绑定属性。
希望这可以解释您的疑虑。
答
一段时间,我下面找出解决的办法,这是相当方便我后我不知道。
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
值。
我希望你会发现有用的有些日子!
答
在运行时没有可靠的方法,但可以使用MethodBase.GetCurrentMethod().Name
并丢弃前四个字符。
该方法存在一些缺陷:通过混淆工具运行二进制文件可能会导致该方法重命名。此外,该方法可能会内联并导致问题(如果您仅在字符串上使用Remove
而不检查长度,甚至可能会导致发布版本中发生意外崩溃,并且在调试模式下难以重现)。
如果你的代码遵循一个模式,并且你需要生成一堆这样的属性,最好使用编译时方法,如代码生成器或面向方面的编程框架。
答
这也应该工作,但你为什么需要这个
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";
}
}
答
可以将属性的名称传递给getter。
如果MyObj中是对象,而如果PROPNAME是变量持有物业的名称,然后将下面的代码做的工作:
eval("Object.defineProperty(MyObj, PropName, { " +
"get : function() { return(\"the prop name is " + PropName + "\"); } });");
请澄清,你会想要做的那。 – 2010-12-06 09:29:34
,你为什么这样做?是否有任何具体要求 – TalentTuner 2010-12-06 09:29:59
所以你想做一个属性,它返回它自己的名字? – 2010-12-06 09:30:56