2009-04-21 5 views
2

Ich versuche, einen vs Code-Schnipsel zu schreiben, die die ausgewählten und umgeben sie mit einer, wenn NULL-Prüfung, das heißt, wie zu schreiben, wenn null Surround-mit Code-Schnipsel

accgrp.CREATEDATE = DateTime.Now; 

werden wird statt:

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

Ich habe soweit wie folgt. $ selected $ scheint nur zu funktionieren, wenn es das letzte Mal benutzt wird. Wenn es mehr als einmal verwendet wird, sind die anderen Instanzen, in denen Sie den ausgewählten Code erwarten würden, leer. Ich verstehe, dass der folgende Code nicht genau das tun würde, was ich möchte, da ich nicht die rechte Seite des Auftrags bekommen werde, sondern es wäre gut genug.

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

Kann jemand helfen?

Antwort

1

Hier Makro für Sie, dass Sie identische Funktionalität zur Verfügung stellt.

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 

Die Alternative (nach dem Kommentar zu lesen) kann PostSharp zu verwenden, um sein Feld/Eigenschaft Setter abzufangen.

+0

v. nice - Ich habe die Makros noch nie zuvor benutzt. Ich habe ein WrapInBrackets funktionieren vorbei an der StyleCop zu erhalten: Funktion WrapInBrackets (ByVal var, ByVal ausgewählt) Dim res As String res = String.Format ("if ({0} == null)", var) res = res & vbCrLf & "{" res = res & vbCrLf & ausgewählt res = res & vbCrLf & "}" WrapInBrackets = res End Function – burnside

1

Angenommen CREATEDATE ist eine Eigenschaft, warum verschiebst du diese Logik nicht da drüben?

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

oder den gleichen ?? Operator außerhalb Setter verwenden:

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

netter Ansatz, ich hatte die ?? vergessen? Operator. Allerdings kann ich die Logik nicht in den Setter verschieben, da accgrp eine Entität im Entity-Framework ist. Für jede Eigenschaft auf der Entität muss ich einen Standardwert festlegen, bei dem der Benutzer keinen Wert eingegeben hat. Ich verstehe, dass es eine Default-Eigenschaft im Ef-Designer gibt, aber es kann keine Funktionen übernehmen. Ihr zweiter Vorschlag ist cool, aber leidet immer noch daran, $ selected $ nicht zweimal in einem Snippet verwenden zu können. – burnside