2010-07-23 23 views
13

Próbuję dodać IntelliSense do edytora kodu C# opartego na formancie richtextbox. Do tej pory mam to analizowanie wprowadzonego tekstu, aby znaleźć wszystkie zmienne i ich typy (działa dobrze). Pole rozwijane działa dobrze. Czego nie mogę uzyskać, to właściwa lista opcji z rozwijanej listy.Implementacja Visual Studio Intellisense

Jak mogę uzyskać następującą listę, programowo:

alt text

już przygotował listę zmiennych i ich typów, więc gdy użytkownik naciśnie . wiem, że mam zmienną c z typ Color. Muszę tylko wiedzieć, jaką funkcję wybrać, aby uzyskać listę potrzebną do rozwijanego okna.

Próbowałem już tego kodu: http://www.codeproject.com/KB/cs/diy-intellisense.aspx, ale nie mogłem go uruchomić poprawnie. Czytałem również mnóstwo innych wątków na StackOverflow bez skutku. Naprawdę chciałbym dokończyć to zamiast używać elementu edytorowego elses kogoś elses.

Wszelkie wskazówki będą mile widziane. Dzięki.

+0

Chciałbym zobaczyć, czy ktoś wie, jak podłączyć się do istniejącej implementacji intellisense, zamiast ponownie ją implementować :) –

+0

Ciekawe, jestem zaskoczony, że nie przyszedłeś do Type.GetMembers wniosek oczywiście. Wiesz, że potrzebujesz informacji o typie, więc dlaczego nie zajrzeć do klasy Type? –

+0

@Kieren Johnstone: To była moja pierwsza próba, jednak otrzymałem złe wyniki. Lista zapełniła się tak, jakbym wpisał "Kolor" zamiast nazwy zmiennej. Tak więc, założyłem, że byłem na niewłaściwym torze. – BoltBait

Odpowiedz

4

Jeśli znasz ten typ, powinieneś być w stanie zastanowić się nad typem i uzyskać wszystkie potrzebne informacje.

Type.GetMembers prawdopodobnie byłby najlepszym wyborem. Możesz potrzebować drugiego połączenia, aby uzyskać jakiekolwiek metody statyczne, a także:

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

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

Każdy obiekt MemberInfo będzie w stanie powiedzieć wam typ członkostwa (własność, pola, metody, zdarzenia, etc.)

wystarczy użyć instanceMembers, gdy użytkownik wpisze zmienną (np. c w twoim przykładzie), a następnie . i użyje staticMembers, gdy użytkownik wpisze nazwę typu (np. Color w twoim przykładzie), a następnie ..

+0

Tak, jak sądzę, potrzebne będą inne wywołania, Type.GetFields(), Type.GetConstructors() i Type.GetEvents(). –

+1

@Nate Dudek - Wszystkie te mogą być obsługiwane przez połączenie do GetMembers. –

+0

Nie wiedziałem tego. Dowiesz się czegoś, co każdego dnia znasz! –

1

Zakładając masz tabelę nazwisko z typów to powinno dać przyzwoity start:

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

Więc może można rozszerzyć swoją nazwę tabeli obejmują:

Type 
Context 
Members 
+0

Przechowuję nazwę i typ jako parę ciągów. – BoltBait

+1

@BoltBait - Możesz utworzyć ładną strukturę i przytrzymać typ jako instancję typu "Type". – ChaosPandion

+0

Dzięki. Przechowywanie "typu" znacznie ułatwiało. – BoltBait

1

którą chcesz w pewnym stopniu wykorzystują odbicie. Jeśli masz typ lub nazwę typu, możesz uzyskać instancję Type.

E.g.

Następnie można wywołać Type.GetMembers() tego Type przedmiotu, zobacz tutaj:

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

... i będziesz miał tablicę MemberInfo obiektów posiadających nazwy (.Name), typ członka (.MemberType), a także inne informacje, takie jak listy parametrów.

Nadzieję, że pomaga.

Powiązane problemy