2016-06-11 17 views
1

Ich benutze den Nhibernate Interceptor, um Werte des alten Zustandes und des aktuellen Status der Entitätseigenschaften zu vergleichen, aber einige der Eigenschaften sind vom Typ ICollection, also könnte mich jemand über wie wenn ein Objekt zu überprüfen, der Typ ist ICollectionWie überprüft man, ob ein Zustandsobjekt vom Typ ICollection ist

dies ist mein Code

public void OnPostUpdate(NHibernate.Event.PostUpdateEvent @event) 
    { 
     var entityToAudit = @event.Entity as IAuditable; 
     string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "AuditLog.txt"); 
     using (StreamWriter sw = File.AppendText(path)) 
     { 
      for (int i = 0; i < @event.OldState.Length; i++) 
      { 
       string propertyName = @event.Persister.PropertyNames[i]; 
       if (@event.OldState[i] != null) 
       { 
        if ([email protected][i].Equals(@event.State[i])) 
        { 
         sw.WriteLine("the value of "+ propertyName + " has been changed from " + @event.OldState[i] + " to " + @event.State[i]); 
        } 
       } 
       else 
       { 
        if (@event.State[i] != null) 
        { 
         sw.WriteLine("the value of "+ propertyName + " has been changed from being empty to " + @event.State[i]); 
        } 
       } 
      } 
     } 
    } 
+0

Sammlungen haben ohnehin eine eigene Art von "vorheriger" Statusverfolgung. Es gibt (normalerweise) nur eine Instanz einer Sammlung, also kann man sie nicht so einfach vergleichen. Übrigens hätte ich kein gutes Gefühl beim Schreiben in eine Datei in einem OnPostUpdate-Trigger. Stellen Sie sich abgesehen von der sehr schlechten Leistung die sehr unangenehmen Dead-Locks vor, die Sie mit kreisförmigen Dateisperren und Datenbanksperren bekommen könnten. –

Antwort

1

Sie haben mehr als eine Option, dies zu tun, verwenden Sie ist oder als mit null Prüfung verwenden:

if (obj is ICollection){ 
    //your logic 
} 

Oder, wenn Sie das Objekt als ICollection brauchen später, empfehle ich als zu verwenden:

var icoll = obj as ICollection 
if (icoll != null){ 
    //use icoll 
    //icoll.Something(); 
} 
0

können Sie die Art überprüfen mit einem einfachen ist wie folgt aus:

var obj = getObject(); 
if(obj is TypeYouWant) 
    doSomething(); 

Good Luck

Verwandte Themen