2015-11-20 7 views
7

この特定のケースがどのように機能するかを理解したいと思います。代わりにパラメータとして実際に行くされているものの値を代入するメソッド呼び出しをインターセプトする方法があるマークされた行の中で述べていたようここでINotifyPropertyChangedのインタフェースが説明されているMSDNの記事(https://msdn.microsoft.com/query/dev12.query?appId=Dev12IDEF1&l=EN-US&k=k%28System.ComponentModel.INotifyPropertyChanged%29;k%28TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5%29;k%28DevLang-csharp%29&rd=trueenter image description hereメソッドパラメータのカスタム属性 - どのように動作するのですか?

からのショットはありますか? これを行うコードがどのようなものかを知りたいと思います。私はプロパティや他のクラスメンバのために設定された属性を使って作業する方法を知っていますが、このユースケースは私にとっては明らかではありません。

ありがとうございました。

+0

同様の質問:[メソッドパラメータ属性の使い方](http://stackoverflow.com/questions/1715) 0365/how-to-use-method-parameter-attributes) – cubrr

+0

私は似たような質問ではないと思います。私はその記事を読んだ。カスタム属性が設定されているパラメータの値を_validate_に設定する方法が尋ねられます。 Jon Skeetはそれは不可能だと答えました。 ここでは、実装されたソリューションを理解するためのコードの例をINotifyPropertyChangedインターフェイスと同様に求めています。 –

答えて

3

これはコンパイラで実装されている機能のようです。この特殊な属性を知っていて、です。は、デフォルト値のときに呼び出し元の名前をオプションの引数に置き換えます。

もしあなたが望むなら、Roslynの実装をチェックすることができます。

場合: - いつもナビゲートするのは非常に簡単ではないですがGetDefaultParameterValue機能で何かhereがあるように思われる(0db946b執筆時現在のもの改正で、少なくとも、ライン844から始まります)オプションのパラメータに<see cref="CallerLineNumberAttribute"/>,<see cref="CallerFilePathAttribute"/>または<see cref="CallerMemberNameAttribute"/>と注釈が付けられており、それに対応する明示的な引数がない場合、このパラメータの値として発信者情報を提供します。ライン912において

(すなわち、類似の新しい機能CallerLineNumberAttributeCallerFilePathAttributeを処理する前にifelse if節)このケースを扱うelse if句がある:

最終的に結合するために使用される
... 
else if (parameter.IsCallerMemberName && ((callerSourceLocation = GetCallerLocation(syntax, enableCallerInfo)) != null)) 
... 

パラメータ:

BoundExpression memberNameLiteral = MakeLiteral(syntax, ConstantValue.Create(memberName), _compilation.GetSpecialType(SpecialType.System_String)); 
defaultValue = MakeConversion(memberNameLiteral, parameterType, false); 
関連する問題