2016-06-11 83 views
1

我使用nhibernate攔截器來比較舊狀態和實體屬性的當前狀態的值,但其中一些屬性的類型爲ICollection,因此任何人都可以指導我如何檢查對象的類型是ICollection如何檢查狀態對象是否爲ICollection

這是我的代碼

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

無論如何,收藏集都有自己的「前」狀態跟蹤。通常只有一個集合的一個實例,所以你不能很容易地比較它。順便說一下,在OnPostUpdate觸發器中寫入文件時,我沒有什麼好的感覺。除了非常糟糕的性能外,想象一下使用循環文件鎖和數據庫鎖時可能會遇到的非常令人討厭的死鎖。 –

回答

1

你有一個以上的選項要做到這一點,使用或使用與空檢查:

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

或者,如果你需要的對象的ICollection稍後,我推薦使用作爲

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

,你可以使用一個簡單的檢查類型 這樣的:

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

好運