在C#4.0中,我正在执行以下操作:
public string PropertyA
{
get;
set
{
DoSomething("PropertyA");
}
}
public string PropertyB
{
get;
set
{
DoSomething("PropertyB");
}
}
我有很多这样的属性,手动操作会很痛苦。有没有一种方法可以用代替它
public string PropertyA
{
get;
set
{
DoSomething(GetNameOfProperty());
}
}
也许是用反射?
在.NET 4.5中,DoSomething
方法应该使用[CallerMemberName]
参数属性:
void DoSomething([CallerMemberName] string memberName = "")
{
// memberName will be PropertyB
}
然后这样称呼它:
public string PropertyA
{
get
{
...
}
set
{
DoSomething();
}
}
请参阅MSDN。
在当前的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以一种干净的方式来做这件事,但这可能并不总是可能的。
您可以使用GetCurrentMethod
的反射。
public string PropertyA
{
get;
set
{
DoSomething(MethodBase.GetCurrentMethod().Name.Substring(4));
}
}
它可用于.Net 4。
正如@hvd所解释的,Name将返回set_PropertyA
,然后使用Substring
获取属性名称。