2012-12-07 20 views
5

Tôi cần liệt kê tất cả các phương thức mở rộng được tìm thấy trên tệp.Làm thế nào để có được các phương pháp mở rộng trên Roslyn?

Đây là những gì tôi đang làm cho đến nay (có vẻ như nó đang làm việc):

var methods = nodes.OfType<MethodDeclarationSyntax>();  
var extensionMethods = methods.Where(m => 
     m.Modifiers.Any(t => t.Kind == SyntaxKind.StaticKeyword) 
     && m.ParameterList.Parameters.Any(p => 
      p.Modifiers.Any(pm => pm.Kind == SyntaxKind.ThisKeyword))); 

Mặc dù tôi không thể kiểm tra tất cả các trường hợp, nó trông như thế này đang làm việc. Nhưng tôi đã tự hỏi nếu có một cách súc tích hơn để tiếp cận giải pháp này.

Có một số loại IsExtension hoặc một số SyntaxKind.ExtensionMethod không? Tôi đã nhìn nhưng không thể tìm thấy bất cứ điều gì rõ ràng, ít nhất.

Tôi đang sử dụng mới nhất của Roslyn tháng chín/12

Trả lời

4

Bạn đang làm việc ở cấp cú pháp và ở cấp độ này, không có những điều như “phương pháp khuyến nông”. Những gì bạn có thể làm là để có được thông tin ngữ nghĩa (được gọi là Symbol) cho mỗi phương pháp và ở đó bạn sẽ thấy cho dù đó là một phương pháp mở rộng. Một cái gì đó như:

SyntaxTree tree = … 
var compilation = Compilation.Create("foo").AddSyntaxTrees(tree); 
var model = compilation.GetSemanticModel(tree); 

var methods = … 
var extensionMethods = 
    methods.Where(m => model.GetDeclaredSymbol(m).IsExtensionMethod); 

Điều này có nghĩa là mã của bạn thực sự cần biên dịch và bạn cũng sẽ phải thêm bất kỳ tham chiếu cần thiết nào vào quá trình biên dịch.

+0

Cảm ơn bạn đã trả lời, nó đã hoạt động. Tôi chỉ tự hỏi liệu tôi có thể sử dụng phương pháp tiếp cận của mình để tránh phải thêm tài liệu tham khảo hay không. Tôi muốn rời khỏi dự án độc lập nhất có thể. Cảm ơn. – eestein

+0

Vâng, nếu bạn không muốn thêm tài liệu tham khảo, thì tôi nghĩ cách tiếp cận của bạn là hợp lý. – svick

+0

Ok, cảm ơn! – eestein

Các vấn đề liên quan