在C#4.0中,我正在做以下事情:
public string PropertyA
{
get;
set
{
DoSomething("PropertyA");
}
}
public string PropertyB
{
get;
set
{
DoSomething("PropertyB");
}
}
..我有很多这些属性,手动操作会很痛苦。有没有办法可以替换它:
public string PropertyA
{
get;
set
{
DoSomething(GetNameOfProperty());
}
}
..也许使用反射?
答案 0 :(得分:2)
在.NET 4.5中,您的DoSomething
方法应使用[CallerMemberName]
参数属性:
void DoSomething([CallerMemberName] string memberName = "")
{
// memberName will be PropertyB
}
然后就这样称呼它:
public string PropertyA
{
get
{
...
}
set
{
DoSomething();
}
}
请参阅MSDN。
答案 1 :(得分:0)
在当前的C#版本中无法做到这一点,反射无济于事。您可以使用表达式破解它并获得编译时间检查,但就此而言,您还必须输入更多代码
DoSomething(()=>this.PropertyA); // have dosomething take an expression and parse that to find the member access expression, you'll get the name there
如果您可以使用Postsharp以干净的方式执行此操作,那么这是一个不错的选择,但这可能并非总是可行。
答案 2 :(得分:0)
您可以使用GetCurrentMethod
的反映。
public string PropertyA
{
get;
set
{
DoSomething(MethodBase.GetCurrentMethod().Name.Substring(4));
}
}
可用于.Net 4。
正如@hvd所解释的那样,名称将返回set_PropertyA
,然后使用Substring
获取属性名称。