【问题标题】:CallerMemberName in .NET 4.0 not working.NET 4.0 中的 CallerMemberName 不起作用
【发布时间】:2013-09-21 08:45:20
【问题描述】:

我正在尝试通过 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;
    }
}

【问题讨论】:

  • 您使用的是哪个版本的编译器?此功能由编译器而非运行时实现。
  • 如果这有帮助:C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>csc /? Microsoft (R) Visual C# 编译器版本 4.0.30319.17929
  • 如果编译器不支持它会导致编译器错误而不是空消息
  • 无论如何 [CallerMemberName] 是在 4.5 中引入的,因此您将无法在 4.0 中使用它。测试 VS2012 目标 4.0 和 C# 5.0
  • Samuel - 这就是 Microsoft BCL Portability 的确切目的。能够在 4.0 中使用选定的 4.5 功能。 nuget.org/packages/Microsoft.Bcl

标签: c# .net .net-4.0 base-class-library callermembername


【解决方案1】:

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

namespace System.Runtime.CompilerServices {
    sealed class CallerMemberNameAttribute : Attribute { }
}
【解决方案2】:

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

【讨论】:

  • 看来您可以在自己的源代码树中伪造它,而不是要求每个开发人员都安装它(尽管如果有人安装它可能会出现问题)。请参阅thisthis
  • 有更简单的方法。检查来自 user373274 的分析器 ... 或这个 thomaslevesque.com/2012/06/13/…
【解决方案3】:

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

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

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

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

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多