Tôi đang thử nghiệm một chút với Roslyn-CTP.Nhận TypeSyntax từ ITypeSymbol
Hiện tại tôi đang cố thay thế var
bằng loại bê tông.
var i=1;
nên trở thành:
int i=1;
Tìm ra loại suy ra rất dễ dàng. Nhưng vì phần này xảy ra trong mô hình ngữ nghĩa, tôi nhận được ITypeSymbol
. Sự thay thế xảy ra trong mô hình cú pháp, vì vậy tôi cần một số TypeSyntax
. Vì tôi không muốn một tên cồng kềnh (global::System.Int32
), việc chuyển đổi phụ thuộc vào ngữ cảnh (using
, các loại lồng nhau, v.v.).
Phiên bản Visual Studio là một phần của Roslyn đã có chức năng này trong "Quickify type name" quickfix, nhưng nhìn qua các mẫu tôi không thể tìm thấy cách dễ dàng để thực hiện chuyển đổi này.
Dựa trên câu trả lời Kevin Pilch-Bisson của tôi hiện nay đang sử dụng:
var location = document.GetSyntaxTree().GetLocation(node);
string name = variableType.ToMinimalDisplayString((Location)location, (SemanticModel)document.GetSemanticModel());
Một vị trí mà ToMinimalDisplayString
thể được lấy từ một CommonSyntaxTree
.
Một biến chứng nữa là ToMinimalDisplayString
đòi hỏi các lớp Location
và SemanticModel
, trong khi document.GetSemanticModel()
và CommonSyntaxTree.GetLocation
chỉ trả lại một giao diện.
Tôi đã làm việc xung quanh bằng cách chỉ đơn giản là truyền đến các lớp học, mà dường như làm việc cho bây giờ.
Hmm có vẻ như các lớp là C# cụ thể và ngôn ngữ giao diện độc lập.
Tôi đã tải lên một phiên bản làm việc trên github: https://github.com/CodesInChaos/Roslyn
Nó không làm việc cho var
trong một foreach
, nhưng tôi nghi ngờ đó là một hạn chế của việc xây dựng Roslyn hiện hành.
câu nói cuối cùng của bạn: Đúng, chúng tôi không nhận được 'var' được triển khai đầy đủ trong' foreach' trước khi xây dựng CTP được hoàn tất, xin lỗi. –