問題タブ [nameof]
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# - Object.GetType() もプロジェクト名を返す
ToString() をオーバーライドし、GetType() を使用して、使用されているオブジェクトの型を返そうとしています。情報を返していますが、名前空間が含まれています。問題は、どうすれば NameSpace を取り除き、オブジェクト名だけを表示できるかということです。これが私のコードです:
c# - nameof と typeof の違い
私が間違っている場合は修正してください。
と
まったく同じ出力が得られるはずです。このソースによると理解できる理由の 1 つ: https://msdn.microsoft.com/en-us/library/dn986596.aspxは、
「nameof を使用すると、定義の名前を変更するときにコードを有効に保つことができます」
クラスインスタンスを文字列として取得したい場合、そのようなことはできません:
ただし、次のようなことができます。
どちらの場合も (typeof
およびnameof
) リファクタリングが可能であるため、nameof
既存のものを実行するために、 などの別の上位レベルのキーワードを再発明する理由は他にありません。私がはっきりと見ていない違いはありますか?
最後に、誰かが の実装を確認するための参照ソースを教えていただければ幸いですnameof
。リフレクションを使用していますか?
更新 1:ここ から取得
nameof
文字列変数を宣言するのと同じくらい効率的です。反射も何もありません!
生成された MSIL をチェックアウトすると、ldstr 演算子を使用して文字列へのオブジェクト参照がスタックにプッシュされるため、文字列宣言と同等であることがわかります。
c# - nameof を使用して C# でセッター メソッド名を取得する
nameof
new演算子を使用してセッター メソッド名を取得することは可能ですか?
うまくいくと思い GetType().GetMethod("set_" + nameof(Foo))
ますが、もっと簡単なものはありますか?
c# - 型引数を指定せずにジェネリック クラスのメンバーで nameof を使用する
Bar の名前を に渡したいのですがType.GetMethod(string)
。としてこれを行うことができますsomeType.GetMethod(nameof(Foo<int>.Bar))
が、ここでint
は完全に任意です。省略できる方法はありますか?残念ながら、うまくいきnameof(Foo<>.Bar)
ません。
このおもちゃのケースではそれほど大したことではありませんが、複数の型パラメーターがあり、特にそれらにwhere
制約が付加されている場合は、それらをすべて説明するのが面倒になる可能性があります。
c# - 静的フィールド初期化子で非静的フィールドの nameof を使用する
List<T>
静的フィールドと非静的フィールドを持つクラスがあります。次に、このリストを次のようなオブジェクトで初期化したいと思います。
最初のFoo
オブジェクトの作成は正常に機能しますが、エラーが発生します
フィールド初期化子は、非静的フィールド、メソッド、またはプロパティ C.bar を参照できません
2番目に。
静的メンバーがインスタンス データにアクセスできないことは承知しています (この質問を参照してください)。しかし、私が理解している限りでnameof
は、コンパイル時に評価され、メタデータのみにアクセスし、インスタンス データにはアクセスしません。では、なぜこれが機能しないのでしょうか。回避策はありますか?
c# - 設定のみのプロパティで「nameof」キーワードを使用する
私の関数では、IMediaPanel
インターフェイスを実装するオブジェクトを受け取ります。
nameof
初期化中に、C# 6.0キーワードを使用しているプロパティの名前を指定する必要があります。
これは問題なく機能しますが、次の式を使用します。
Visual Studio で次のエラーが表示されます。
プロパティ「MyNamespace.IMediaPanel.IsNextEntityExists」にはゲッターがありません。
「制限の名前」を検索しても、この問題についての答えは得られませんでした。さらに、公式の発言には、プロパティ ゲッターに関する制限が含まれていません。
... 以下は、エラーを生成することに言及する価値があります: 事前定義された型 (int または void など)、null 許容型 (Point?)、配列型 (Customer[,])、ポインター型 (Buffer*)、修飾エイリアス (A ::B)、バインドされていないジェネリック型 (Dictionary<,>)、前処理シンボル (DEBUG)、およびラベル (ループ:)。...
この制限がある理由と、それについての参照があるかどうかを誰かが説明できますか? nameof
リフレクションを介して一般的な型情報を使用する必要があるのに、キーワードがプロパティのインスタンスゲッターを使用するように強制できる理由は何ですか? (少なくともこの特定のケースでは、不明な型のためにインスタンスのプロパティを直接指すことができない場合、このインスタンスがインターフェイスを実装していることを知っているだけです)
アップデート
コメントからの@Gusdorの提案が機能しない理由を説明するには、InitConnections
関数を呼び出す方法を明確にする必要があります(簡略化された形式で):
そのため、 Initnameof(panelControl.IsNextEntityExists)
関数内で使用すると、FrameworkElement にカスタム クライアントのプロパティが含まれていないため、エラーが発生します。また、 InitConnections関数内で同じ式を使用すると、getter に関するエラーが発生します - の場合と同じです。 IsNextEntityExists
nameof(IMediaPanel.IsNextEntityExists)
とにかく、私は答えを見つけました。この「ゲッター」エラーはReSharperのバグです(私自身の答えを参照してください)。