23

我正在尝试CallerMemberName通过 BCL 可移植包在 .NET 4.0 中使用属性。它总是返回一个空字符串而不是成员名称。我究竟做错了什么?

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

3 回答 3

32

如果您添加以下内容,定位 4.0 就可以正常工作:

namespace System.Runtime.CompilerServices {
    sealed class CallerMemberNameAttribute : Attribute { }
}
于 2016-08-11T12:22:59.413 回答
16

我找到了解决方案,尽管它对我没有用。您需要在 .NET Framework 4 之上安装KB2468871才能使用调用方信息属性。不幸的是,我不能要求每个开发人员在设置开发环境时记得安装它。

于 2013-10-09T22:53:45.893 回答
8

据我所知,CallerMemberName.Net 4.5 支持你不应该在 .Net 4.0 中使用它

有人在 .Net 4.0 中使用 StackTrace 实现了这一点。例如: http ://www.journeyintocode.com/2013/04/callermembername-net-40.html

但是,我不建议您使用 StackTrace,因为这可能会影响性能。使用 StackTrace 获取调用者姓名非常非常慢。这在 Debug 中有效,在发布时您无法确定 StackTrace 是否“正确”。

所以,我的建议是:只CallerMemberName在 .Net 4.5 或更高版本中使用。在.Net 的早期版本中,没有任何万无一失或快速的方法可以做到这一点。

于 2014-01-18T02:09:27.320 回答