CallerMemberName в.NET 4.0 не работает

Я пытаюсь использовать CallerMemberName атрибут в.NET 4.0 через пакет переносимости BCL. Он всегда возвращает пустую строку вместо имени члена. Что я делаю неправильно?

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;
    }
}

3 ответа

Решение

Я нашел решение, хотя оно мне не пригодилось. Вам нужно установить KB2468871 поверх.NET Framework 4, чтобы иметь возможность использовать атрибуты информации о вызывающем абоненте. К сожалению, я не могу попросить каждого разработчика не забыть установить его при настройке среды разработки.

Таргетинг 4.0 работает просто отлично, если добавить:

namespace System.Runtime.CompilerServices {
    sealed class CallerMemberNameAttribute : Attribute { }
}

Насколько я знаю, 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 нет надежного или быстрого способа сделать это.

Другие вопросы по тегам