Получить пространство имен во фрагменте кода

Ссылка Microsoft здесь перечисляет три метода, которые мы можем использовать.

Но как нам получить текущее пространство имен? Я вижу, что есть похожий вопрос, но ответ на него заключается в использовании макросов, которые не решают этот конкретный вопрос.

NameSpace(), чтобы сделать что-то вроде этого:

<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            .
            .
        </Header>
        <Snippet>
            <Declarations>
                <Literal>
                    <ID>namespace</ID> 
                    <Function>NameSpace()</Function>                     
                </Literal>
            </Declarations>
            <Code Language="csharp">
                <![CDATA[
                    $namespace$
                ]]>
            </Code>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>

person dushyantp    schedule 04.10.2012    source источник
comment
Так ты надстройку пишешь или что?   -  person Cole Johnson    schedule 04.10.2012
comment
да, в основном добавление большего количества фрагментов, чтобы ускорить кодирование на языках, отличных от C#.   -  person dushyantp    schedule 04.10.2012


Ответы (1)


Выяснил, что это можно сделать, и это показывает классы ExpansionProvider и ExpansionFunction

Для приведенного выше фрагмента мне пришлось сделать что-то вроде этого:

internal class NameSpaceExpansionFunction : ExpansionFunction
    {
        public NameSpaceExpansionFunction(ExpansionProvider provider)
            : base(provider)
        {
        }

        public override string GetCurrentValue()
        {
           //get namespace
           return namespace;
        }
    }

И LanguageService сообщает файлу фрагмента, где искать определение функции:

public class MyLanguageService : LanguageService
    {
        public override ExpansionFunction CreateExpansionFunction(ExpansionProvider provider,
                                                                  string functionName)
        {
            ExpansionFunction function = null;
            if (String.Compare(functionName, "NameSpace", true) == 0)
            {
                function = new NameSpaceExpansionFunction(provider);
            }
            return function;
        }
    }

Это оказалось больше похоже на учебный вопрос, поэтому я предоставил ссылки выше. Должно быть полезно. Работал для меня :)

person dushyantp    schedule 05.10.2012
comment
Так куда же делись NamespaceExpansionFunction и MyLanguageService? - person Daryl; 22.10.2015
comment
MyLanguageService должен войти в ваш проект VSPackage. По следующей ссылке рассказывается больше о разработке VSPackage: msdn.microsoft.com/en-us /библиотека/dn705845.aspx - person dushyantp; 23.10.2015
comment
Как выглядит весь ваш класс LanguageService? Существует множество других абстрактных методов, которые необходимо перегрузить. Также метод GetCurrentValue() не выглядит полным. Что такое пространство имен? Почему теперь после него стоит точка с запятой? - person Daryl; 23.10.2015
comment
Привет! Вам нужно будет пройти руководство по VSPackage, чтобы понять, как должен выглядеть класс LanguageService. Вам нужно будет переопределить методы в соответствии с вашими требованиями. GetCurrentValue выше является примером, а не реализацией. Мы не можем его запустить. Это просто показывает, что мы можем использовать некоторую логику для получения пространства имен во время вставки фрагмента. Проверьте MSDN для документации ExpansionFunction для получения дополнительной информации об этом. - person dushyantp; 27.10.2015
comment
Насколько я понимаю, вы создаете это, если создаете новый язык, но вы не можете сказать, использовать его в C#, это правильно? - person Daryl; 27.10.2015
comment
Да, это правильно. Я не знаю, как добавить эту ExpansionFunction во фрагмент C#. - person dushyantp; 28.10.2015