2010-07-23 38 views
13

Tôi đang cố gắng thêm trình chỉnh sửa mã Intellisense vào C# dựa trên điều khiển richtextbox. Cho đến nay, tôi đã có nó phân tích cú pháp văn bản đã nhập để tìm tất cả các biến và loại của chúng (hoạt động tốt). Hộp thả xuống hoạt động tốt. Những gì tôi không thể có được là một danh sách các tùy chọn thích hợp cho hộp danh sách thả xuống.Thực hiện Visual Studio Intellisense

Làm thế nào tôi có thể nhận được danh sách sau đây, cách lập trình:

alt text

tôi đã biên soạn một danh sách các biến và các loại của họ, vì vậy khi người dùng nhấn . tôi biết rằng tôi có một biến c của nhập Color. Tôi chỉ cần biết chức năng nào cần gọi để lấy danh sách tôi cần cho hộp thả xuống.

Tôi đã thử mã này: http://www.codeproject.com/KB/cs/diy-intellisense.aspx nhưng không thể làm cho mã hoạt động bình thường. Tôi cũng đã đọc một tấn các chủ đề khác trên StackOverflow để không có kết quả. Tôi thực sự muốn hoàn thành điều này thay vì sử dụng một thành phần elses drop-in editor.

Mọi gợi ý sẽ được đánh giá cao. Cảm ơn.

+0

Ooh, tôi muốn xem liệu có ai đó biết cách móc vào triển khai intellisense hiện có hay không, thay vì thực hiện lại nó :) –

+0

Không quan tâm, tôi rất ngạc nhiên khi bạn không truy cập Type.GetMembers kết luận một cách tự nhiên. Bạn biết bạn cần thông tin về một loại, vậy tại sao không nhìn vào lớp Type? –

+0

@Kieren Johnstone: Đó là lần thử đầu tiên của tôi, tuy nhiên tôi đã nhận được kết quả sai. Danh sách đã được điền như thể tôi đã gõ 'Color.' thay vì tên biến. Vì vậy, tôi cho rằng tôi đã đi sai hướng. – BoltBait

Trả lời

4

Nếu bạn biết loại, bạn sẽ có thể Phản ánh trên loại và nhận tất cả thông tin bạn cần.

Type.GetMembers có lẽ sẽ là đặt cược tốt nhất của bạn. Bạn có thể cần một cuộc gọi thứ hai để có được bất kỳ phương pháp tĩnh cũng như:

var instanceMembers = typeof(Color) 
         .GetMembers(BindingFlags.Instance | BindingFlags.Public); 

var staticMembers = typeof(Color) 
        .GetMembers(BindingFlags.Static | BindingFlags.Public); 

Mỗi đối tượng MemberInfo sẽ có thể cho bạn biết membertype (tài sản, Field, Phương pháp, tổ chức sự kiện, vv)

Chỉ cần sử dụng số instanceMembers khi người dùng nhập biến (như c trong ví dụ của bạn) theo sau là . và sử dụng staticMembers khi người dùng nhập tên loại (như Color trong ví dụ của bạn) theo sau là ..

+0

Có, Type.GetFields(), Type.GetConstructors() và Type.GetEvents() sẽ là các cuộc gọi khác cần thiết, tôi tin. –

+1

@Nate Dudek - Tất cả những điều đó có thể được xử lý bằng cuộc gọi tới GetMembers. –

+0

Không biết điều đó. Bạn học một cái gì đó biết mỗi ngày! –

1

Giả sử bạn có một bảng tên với các loại này sẽ cho bạn một sự khởi đầu khá:

var type = _names[name].Type; 
var members = type.GetMembers(); // Check context to grab private methods? 

Vì vậy, có lẽ bạn có thể mở rộng bảng tên của bạn để bao gồm:

Type 
Context 
Members 
+0

Tôi đang lưu tên và nhập dưới dạng một chuỗi. – BoltBait

+1

@BoltBait - Bạn có thể muốn tạo một cấu trúc đẹp và giữ kiểu như một thể loại 'Loại' thay thế. – ChaosPandion

+0

Cảm ơn. Lưu trữ 'Type' làm cho nó dễ dàng hơn nhiều. – BoltBait

1

Bạn muốn sử dụng sự phản chiếu ở một mức độ nào đó. Nếu bạn có loại hoặc tên của loại, bạn có thể nhận được phiên bản Type.

Ví dụ:

Sau đó, bạn có thể gọi Type.GetMembers() trên mà đối tượng Type, xem tại đây:

http://msdn.microsoft.com/en-us/library/424c79hc.aspx

... và bạn sẽ có một loạt các MemberInfo đối tượng có tên (.Name), loại thành viên (.MemberType) và từ thông tin khác đó, như danh sách tham số.

Hy vọng điều đó sẽ hữu ích.

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