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;
}
}
解決策は見つかりましたが、役に立ちませんでした。発信者情報属性を使用できるようにするには、.NET Framework 4の上に KB2468871 をインストールする必要があります。残念ながら、開発者が開発環境をセットアップするときに必ずインストールするように依頼することはできません。
以下を追加した場合、ターゲット4.0は正常に機能します。
namespace System.Runtime.CompilerServices {
sealed class CallerMemberNameAttribute : Attribute { }
}
知っているように、CallerMemberName
は.Net 4.5からサポートされています。Net4.0では使用しないでください。
誰かが.Net 4.0でStackTraceを使用してこれを実装しました。例: http://www.journeyintocode.com/2013/04/callermembername-net-40.html
ただし、パフォーマンスが低下する可能性があるため、StackTraceの使用はお勧めしません。 StackTraceを使用して呼び出し元の名前を取得すると、非常に時間がかかります。そして、これはデバッグで機能します。リリースでは、StackTraceが「正しい」かどうかはわかりません。
だから、私の提案は:.Net 4.5以降のバージョンではCallerMemberName
を使用するだけです。 .Netの初期バージョンでは、これを行うための絶対的または迅速な方法はありません。