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;
}
}
Ответы
Ответ 1
Я нашел решение, хотя это мне не полезно. Вам нужно установить KB2468871 поверх .NET Framework 4, чтобы иметь возможность использовать атрибуты информации о вызывающем абоненте. К сожалению, я не могу просить каждого разработчика помнить об установке его при настройке среды разработки.
Ответ 2
Targeting 4.0 работает отлично, если вы добавляете:
namespace System.Runtime.CompilerServices {
sealed class CallerMemberNameAttribute : Attribute { }
}
Ответ 3
Как я знаю, 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 нет надежного или быстрого способа сделать это.