2015-11-20 29 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);