как писать, если нулевой объемный фрагмент кода - PullRequest
2 голосов
/ 21 апреля 2009

Я пытаюсь написать фрагмент кода vs, который возьмет выделенное и окружит его проверкой if null, т. Е.

accgrp.CREATEDATE = DateTime.Now;

станет:

if (accgrp.CREATEDATE == null)
        {
            accgrp.CREATEDATE = DateTime.Now;
        }

Я дошел до ниже. Кажется, что $ selected $ работает только при последнем использовании, если его использовать более одного раза, остальные случаи, когда вы ожидали увидеть выбранный код, пустые. Я понимаю, что приведенный ниже код не будет делать именно то, что я хочу, так как я не получу правую часть задания, но это будет достаточно хорошо.

            <Declarations>
            <Literal>
                <ID>expression</ID>
                <ToolTip>Expression to evaluate</ToolTip>
                <Default>o</Default>
            </Literal>
        </Declarations>
        <Code Language="csharp"><![CDATA[if ($selected$ == null)
{
    $selected$ = $expression$$end$   
}]]>
        </Code>

Может кто-нибудь помочь?

Ответы [ 2 ]

1 голос
/ 21 апреля 2009

Вот макрос для вас, который предоставит вам идентичные функции.

Sub NullCheck()
    Dim selected As String
    Dim var As String
    Dim res As String
    Dim sel As TextSelection


    sel = DTE.ActiveDocument.Selection
    selected = sel.Text        
    var = selected.Substring(0, selected.IndexOf("=") - 1).Trim()
    res = String.Format("if ({0} == null) {1} ", var, selected)

    sel.Delete()
    sel.Insert(res, vsInsertFlags.vsInsertFlagsContainNewText)
    sel.SmartFormat()

End Sub

Альтернативой (после прочтения вашего комментария) может быть использование PostSharp для перехвата установки поля / свойства.

1 голос
/ 21 апреля 2009

Предполагая, что CREATEDATE является свойством, почему бы вам не перенести эту логику туда?

DateTime? CREATEDATE
{
    set { _createdate = value ?? DateTime.Now; }
}

или используйте тот же оператор ?? вне сеттера:

accgrp.CREATEDATE = accgrp.CREATEDATE ?? DateTime.Now;
...