我正在尝试通过BCL可移植性包在.NET 4.0中使用CallerMemberName
属性。它始终返回空字符串而不是成员名称。我做错了什么?
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
MessageBox.Show(new class2().CallMe);
}
}
public class class2
{
public string CallMe
{
get
{
return HelpMe();
}
}
private string HelpMe([CallerMemberName] string param = "")
{
return param;
}
}
如果您添加以下内容,则定位 4.0 就可以正常工作:
namespace System.Runtime.CompilerServices {
sealed class CallerMemberNameAttribute : Attribute { }
}
我找到了解决方案,尽管它对我没有用。您需要在 .NET Framework 4 之上安装 KB2468871 才能使用调用方信息属性。不幸的是,我不能要求每个开发人员在设置开发环境时记住安装它。
据我所知,.Net 4.5 支持CallerMemberName
不应在 .Net 4.0 中使用它
有人使用 StackTrace 在 .Net 4.0 中实现了这一点。 例如:http://www.journeyintocode.com/2013/04/callermembername-net-40.html
但是,我不建议您使用StackTrace,因为可能会降低性能。使用 StackTrace 获取调用方名称非常非常慢。这在调试中有效,在发布中,您无法确定 StackTrace 是否"正确"。
所以,我的建议是:只需在.Net 4.5或更高版本中使用CallerMemberName
即可。在 .Net 的早期版本中,没有任何万无一失或快速的方法可以做到这一点。