問題タブ [callermembername]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - C#で呼び出し元情報とともにparamsキーワードを使用するには?
C# 5.0 Caller Information と C# params キーワードを組み合わせようとしています。意図は、ロギング フレームワークのラッパーを作成することであり、ロガーでテキストを String.Format のようにフォーマットする必要があります。以前のバージョンでは、メソッドは次のようになりました。
これを次のように呼びます。
ここで、発信者情報をキャプチャしてログに記録したいと考えています。したがって、署名は次のようになります。
params は最後のパラメーターでなければならないため、これはコンパイルされません。だから私はこれを試します:
sourceMembername を提供するか、名前付きパラメーターとして明示的に messageArgs 引数を割り当てることなく、それを呼び出す方法はありますか? これを行うと、params キーワードの目的が無効になります。
これを行う方法はありますか?発信者情報が渡される「ハッキー」な方法では、params キーワードを使用できないようです。呼び出し元のメンバー情報パラメーターが実際にはパラメーターではないことを C# コンパイラが認識できれば、すばらしいことです。それらを明示的に渡す必要はないと思います。
私のバックアップは params キーワードをスキップすることであり、呼び出し元は最後の例で長い署名を使用する必要があります。
c# - セットプロパティを呼び出すイベントを評価することは可能ですか?
1 つの自動 get/set プロパティを持つ通常の C# クラスがあるとします。
SomeProperty の set メソッドが呼び出されたときに発生し、評価できるイベントはありますか?
このようなことは何らかの方法で可能ですか?おそらく反射ですか?:
疑似コード、実コードなし:
CallerMember を使用できることはわかっていますが、auto プロパティを変更する必要がありました。
c# - .NET 4.5.3 でプロパティの変更を通知するために、CallerMemberNameAttribute の代わりに nameof 演算子を使用する利点はありますか?
.NET 4.5.3 の出現により、WPF 開発者は、プロパティの変更をINotifyPropertyChanged
インターフェイスに通知する 3 つ (またはそれ以上) の方法を使用できるようになりました。基本的に、私の質問は、.NET 4.5 以降で導入された 2 つの方法のどちらが、プロパティの変更を通知するより効率的な方法であり、WPF で使用する場合にどちらの方法にも利点があるかどうかです。
バックグラウンド
このテーマにあまり詳しくない人のために、主な 3 つの方法を次に示します。1 つ目は、単純に文字列を渡す元の、よりエラーが発生しやすい方法です。
2 番目の方法は .NET 4.5 で導入されました。CallerMemberNameAttribute
:_
3 番目の最新の方法は、.NET 4.5.3 の一部として C#6.0 に導入されました (または間もなく導入される予定です)。nameof
オペレーター: _
私自身の推測では、単純に文字列を渡す元の、よりエラーが発生しやすい方法が最も効率的であると思います。他の 2 つの方法は何らかの形式のリフレクションを使用しているとしか想像できないからです。ただし、他の 2 つの方法のどちらがより効率的で、WPF コンテキストでのCallerMemberNameAttribute
属性と演算子の使用に実際に違いがあるかどうかを知りたいと思っています。nameof
c# - CompilerServices.CallerMemberAttribute と同様の動作を持つ属性の実装
CallerMemberNameAttribute
?に似た動作を持つ属性を作成することは可能です。
つまり、Google で検索してこの記事を見つけたということです。つまり、CallerMemberName は CompilerServices グループに属する属性であるということです。つまり、この属性によって、コンパイラが IL をビルドする方法が変わるということです。そのため、C# コンパイラをカスタマイズせずにこの動作を再現することは不可能です。
しかし、私はまだ確信が持てません。スタックオーバーフローの誰かが別のことを言うことができることを願っています。したがって、この質問はそれに対するものです。
いくつかのコンテキスト:
私は主にこのコードを改善するためにこれを探しています:
私のアプリケーションには、辞書であり、特定のキーを表すプロパティを持つ多くのクラスがあります。
StackTrace
(C# 4.0) と(C# 5.0) を使用CallerMemberName
して、コードを次のように更新できました。
今、私の目標は、次のようなものをアーカイブすることです:
誰かが私を助けることができますか?それが可能だ?
c# - CallerMemberName が propertyName を返さない
突然機能しなくなったコードを扱っています。問題を .NET 4 の CallerMemberName 機能まで追跡しました
[CallerMemberName] String propertyName = "" は、プロパティ "speed" から呼び出されているにもかかわらず、"" を返します。以前は問題なく動作していましたが、プロジェクトが「.NET Framework 4」をターゲットにしていることを確認しました。何がこれを引き起こす可能性がありますか?
プロパティ コード:
ここで処理されます:
編集: Microsoft BCL Portability Pack をインストールすると、同じように動作しますが、次の警告が表示されます。
警告 10 'D:\Projects...MainWindow.xaml.cs' の型 'System.Runtime.CompilerServices.CallerMemberNameAttribute' は、'd:\Projects.. .\packages\Microsoft.Bcl.1.1.10\lib\net40\System.Runtime.dll'. 「D:\Projects....\MainWindow.xaml.cs」で定義されたタイプを使用します。D:\Projects...AnOtherClass.xaml.cs
java - Java の発信者情報
C# には発信者情報があります
MSDN リンク: CallerInfo
Javaに同等の注釈があるかどうかを知りたいですか?
これらの機能は、追跡を改善するのに役立ちます
アップデート :
私はクラスを書きました:
そして trace() メソッドを呼び出します:
および結果:
私には当てはまりません。次のような結果が必要です。
実際、クラスとメソッドがどのように trace() を呼び出すかを知りたい (親)
c# - CallerMemberName は、フィールドの属性コンストラクターでは機能しません
私は C# (.NET 4.5、VS 2013) でシリアライザーを作成しています。属性を使用して、読み取りと書き込みのためにメンバーを格納する名前など、シリアル化メタデータを制御しています。毎回属性の引数としてメンバー名を書き出すのは嫌なので、CallerMemberName を使用しようとしています。
プロパティの場合は問題なく動作します。コンストラクタが呼び出されるとプロパティ名が渡され、属性によって逆シリアル化でプロパティ値を割り当てることができます。
フィールドの場合、何らかの理由で、CallerMemberName は機能しません。代わりに、他の引数パラメーターが正しく渡されている場合でも、毎回デフォルトの string.Empty を取得しています。
これをテストするための私の現在のコードは次のとおりです。
フィールドが引数を受け取らず、コンストラクターが呼び出されていることを確認するためにフィールドが引数を受け取り、コンストラクターが呼び出されていることを二重に確認するためにフィールドがコンストラクター例外をスローしてテストしましたが、わかりません私が間違っていることを出してください。
c++-cli - C++/CLI: C++/CLI で CallerMemberNameAttribute を使用するにはどうすればよいですか?
C# と VB.Net では、 CallerMemberNameAttributeを使用して呼び出し元の名前を文字列として取得できます。
C++/CLI で同じことをしたいのですが、どういうわけかうまくいきません。いくつかの構造を試してみましたが、C++/CLI コンパイラがこの属性をサポートしているかどうか疑問に思い始めています。
(簡略化された)実装は次のとおりです。
C# アプリケーションでこのメソッドを呼び出すと、name の値が null になります。属性DefaultParameterValueも試しましたが、どちらも役に立ちませんでした。今、アイデアが不足しています。
明白な答えは、なぜ C# で実装しないのですか? この特定のケースでは、C++/CLI に限定されています。