2015-11-20 32 views
7

我想了解這個特定情況如何工作。下面是從MSDN文章的射門,其中INotifyPropertyChanged接口說明(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 herec#方法參數的自定義屬性 - 它是如何工作的?

,因爲它是在標線表示,目前攔截方法調用的值代入,而不是什麼實際的去作爲參數的方法嗎? 我想知道做這個的代碼是什麼樣的。我知道如何使用爲屬性和其他類成員設置的屬性,但這個用例對我來說並不明確。

謝謝。

+0

相似的問題:[如何使用方法參數屬性](http://stackoverflow.com/questions/1715 0365 /如何使用方法參數屬性) – cubrr

+0

我不認爲這是一個類似的問題。我讀過那篇文章。會詢問如何設置自定義屬性的參數的_validate_值。 Jon Skeet回答說這是不可能的。 這裏我要求一個代碼的例子來理解INotifyPropertyChanged接口的實現解決方案。 –

回答

3

這似乎是在編譯器中實現的功能:它知道這個特殊的屬性和替代呼叫者的名字進入的時候它有它的默認值可選參數。

如果你想要,你可以檢查Roslyn的實現。

如果: - 雖然不總是非常簡單的導航似乎是在GetDefaultParameterValue功能的東西here0db946b在當前的版本作爲寫作的時間開始於線844,至少)可選參數註釋爲<see cref="CallerLineNumberAttribute"/>,<see cref="CallerFilePathAttribute"/><see cref="CallerMemberNameAttribute"/>,且沒有對應的顯式參數,我們將提供主叫信息作爲該參數的值。

在線912有一個else if子句來處理這種情況下(在這之前的ifelse if子句處理相似的新特性CallerLineNumberAttributeCallerFilePathAttribute):

... 
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);