方法参数的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子句来处理这种情况(在处理类似的新特性CallerLineNumberAttributeCallerFilePathAttribute之前的ifelse 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