web-dev-qa-db-ja.com

.NET 4.0のCallerMemberNameが機能しない

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

解決策は見つかりましたが、役に立ちませんでした。発信者情報属性を使用できるようにするには、.NET Framework 4の上に KB2468871 をインストールする必要があります。残念ながら、開発者が開発環境をセットアップするときに必ずインストールするように依頼することはできません。

16
Pradeep

以下を追加した場合、ターゲット4.0は正常に機能します。

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

知っているように、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の初期バージョンでは、これを行うための絶対的または迅速な方法はありません。

8
Yaping Xin