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