方法参数的c#自定义属性
我想了解这个特定案例的工作原理。 这里是从msdn文章中解释INotifyPropertyChanged接口的说明(https://msdn.microsoft.com/query/dev12.query?appId=Dev12IDEF1&l=zh-CN&k=k%28System.ComponentModel.INotifyPropertyChanged%29;k%28TargetFrameworkMoniker -.NETFramework,版本%3Dv4.5%29; K-%28DevLang-CSHARP%29&RD =真)
正如它用标记线表示的那样,有一种拦截方法调用的方法来替代一个值,而不是实际的参数? 我想了解执行此操作的代码的样子。 我知道如何使用为属性和其他类成员设置的属性,但这个用例对我来说并不明确。
谢谢。
它似乎是在编译器中实现的一个功能:它知道这个特殊属性,并且它具有默认值时将调用者的名称替换为可选参数。
如果你想要,你可以检查Roslyn的实现。 尽管导航并不总是很直接,但在GetDefaultParameterValue
函数中(从第844行开始,至少在写入时的当前版本 - 0db946b
)中似乎有些东西:
如果可选参数使用<see cref="CallerLineNumberAttribute"/>
, <see cref="CallerFilePathAttribute"/>
或<see cref="CallerMemberNameAttribute"/>
,并且没有与之对应的明确参数,我们将提供调用者信息作为此参数的值。
在第912行有一个else if
子句来处理这种情况(在处理类似的新特性CallerLineNumberAttribute
和CallerFilePathAttribute
之前的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);
链接地址: http://www.djcxy.com/p/30481.html
上一篇: c# custom attribute for a method parameter
下一篇: How to unit test this line of LayoutInflater.from() in android