2009-04-21 5 views
2

Je suis en train d'écrire un code qui vs extrait prendra sélectionné et l'entourer d'un contrôle si nul, à savoircomment écrire si surround avec le code null snippet

accgrp.CREATEDATE = DateTime.Now; 

deviendra:

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

J'ai aussi loin que ci-dessous. $ selected $ ne semble fonctionner que la dernière fois qu'il est utilisé, s'il est utilisé plus d'une fois, les autres instances où vous vous attendiez à voir le code sélectionné sont vides. Je comprends que le code ci-dessous ne ferait pas exactement ce que je veux, car je n'obtiendrai pas le côté droit de la tâche, mais ce serait suffisant.

  <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> 

Quelqu'un peut-il aider?

Répondre

1

Voici macro pour vous, qui vous fournira des fonctionnalités identiques.

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 

L'alternative (après avoir lu votre commentaire) peut être utiliser PostSharp afin d'intercepter le terrain/setter de propriété.

+0

v. nice - Je n'ai jamais utilisé les macros auparavant. J'ai ajouté une fonction WrapInBrackets pour dépasser les StyleCop: WrapInBrackets de fonction (ByVal var, ByVal sélectionné) res Dim As String = res String.Format ("if ({0} == null)", var) res = res & vbCrLf & "{" res = res vbCrLf et sélectionné res = res & vbCrLf & "}" WrapInBrackets = res End Function – burnside

1

En supposant que CREATEDATE est une propriété, pourquoi ne déplacez-vous pas cette logique là-bas?

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

ou utiliser le même opérateur ?? extérieur setter:

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

bonne approche, j'avais oublié le ?? opérateur. Cependant, je ne peux pas déplacer la logique vers le setter car accgrp est une entité dans le framework d'entité. pour chaque propriété de l'entité, j'ai besoin de définir une valeur par défaut où l'utilisateur n'a entré aucune valeur. Je comprends qu'il existe une propriété defaultvalue dans le concepteur ef, mais elle ne peut pas prendre de fonctions. votre deuxième suggestion est cool, mais souffre toujours de ne pas pouvoir utiliser $ $ $ deux fois dans un extrait – burnside