2015-11-20 20 views
7

Tôi muốn hiểu trường hợp cụ thể này hoạt động như thế nào. Dưới đây là bắn từ bài viết MSDN nơi giao diện INotifyPropertyChanged được giải thích (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=true) enter image description hereC# thuộc tính tùy chỉnh cho tham số phương thức - cách thức hoạt động?

Như nó nói trong dòng đánh dấu có một cách để chặn cuộc gọi phương pháp để thay thế một giá trị thay vì những gì là thực tế diễn ra như một tham số? Tôi muốn biết ý tưởng của mã để thực hiện điều này. Tôi biết cách làm việc với các thuộc tính được đặt cho các thuộc tính và các thành viên lớp khác nhưng trường hợp sử dụng này không rõ ràng đối với tôi.

Cảm ơn.

+0

Câu hỏi tương tự: [Cách sử dụng thuộc tính tham số phương pháp] (http://stackoverflow.com/questions/1715 0365/how-to-use-method-parameter-attributes) – cubrr

+0

Tôi không nghĩ đó là một câu hỏi tương tự. Tôi đã đọc bài đó. Đã hỏi làm thế nào để _validate_ giá trị của một tham số mà thuộc tính tùy chỉnh được thiết lập. Jon Skeet trả lời là không thể. Ở đây tôi yêu cầu một ví dụ về mã để hiểu giải pháp đã triển khai như đối với giao diện INotifyPropertyChanged. –

Trả lời

3

Có vẻ như là một tính năng được thực hiện trong trình biên dịch: nó biết về thuộc tính đặc biệt này và thay thế tên của người gọi vào đối số tùy chọn khi nó có giá trị mặc định.

Nếu bạn muốn, bạn có thể kiểm tra triển khai Roslyn. Mặc dù nó không phải lúc nào cũng rất đơn giản để điều hướng có vẻ là một cái gì đó here trong GetDefaultParameterValue function (bắt đầu từ dòng 844, ít nhất là trong phiên bản hiện tại tính đến thời điểm viết bài - 0db946b):

nếu thông số tùy chọn được chú thích với <see cref="CallerLineNumberAttribute"/>, <see cref="CallerFilePathAttribute"/> hoặc <see cref="CallerMemberNameAttribute"/> và không có đối số rõ ràng nào tương ứng với nó, chúng tôi sẽ cung cấp thông tin người gọi làm giá trị của thông số này.

Tại dòng 912 có một khoản else if để xử lý trường hợp này (ifelse if khoản trước khi có thể xử lý các tính năng tương tự mới CallerLineNumberAttributeCallerFilePathAttribute):

... 
else if (parameter.IsCallerMemberName && ((callerSourceLocation = GetCallerLocation(syntax, enableCallerInfo)) != null)) 
... 

được cuối cùng dùng để ràng buộc tham số:

BoundExpression memberNameLiteral = MakeLiteral(syntax, ConstantValue.Create(memberName), _compilation.GetSpecialType(SpecialType.System_String)); 
defaultValue = MakeConversion(memberNameLiteral, parameterType, false); 
Các vấn đề liên quan