2016-03-03 127 views
2

的代碼第一部分:Excel工作表對象不等於同一工作表對象

activeWorksheet = Globals.ThisAddIn.Application.ActiveSheet; 
var allWorksheets = new List<Worksheet>(); 

這是我測試:

allWorksheets.Add(activeWorksheet); 
Debug.WriteLine(activeWorksheet.Name); //prints Sheet1 
Debug.WriteLine(allWorksheets[0].Name); //prints Sheet1 
Debug.WriteLine(allWorksheets[0] == activeWorksheet); //prints true 

當我在後臺運行,這是一個任務,它不起作用。當我執行最後一次比較時,即使它打印Sheet1和Sheet1,它也會返回false

new Task(() => 
{ 
    allWorksheets.Add(activeWorksheet); 
    Debug.WriteLine(activeWorksheet.Name); //prints Sheet1 
    Debug.WriteLine(allWorksheets[0].Name); //prints Sheet1 
    Debug.WriteLine(allWorksheets[0] == activeWorksheet); //prints false 
} 

Excel中的工作表是否存在一些奇怪的背景行爲?我已經暫時比較了工作表名稱,但是這不應該起作用嗎?

+0

你能發佈更多的代碼嗎?如何/在哪裏宣佈activeWorksheet'以及它是如何設置的? ''''allWorksheets'''的問題相同。 – dee

+0

更新了我的答案。 – Peroxy

+0

我只能猜測......在這裏,編譯器關閉了在lambda表達式之外聲明的變量,並且編譯器可能必須創建一個包含執行代碼所需的所有變量的新類。您將不得不反編譯並觀察生成的內容,以便了解爲什麼最後的比較返回false。 – dee

回答

1

我有類似的問題。我創建了一個包裝對象Interop.Excel.Worksheet,並實現了這個等於方法:

Public Overrides Function Equals(obj As Object) As Boolean 

    Dim other = TryCast(obj, Worksheet) 
    If other Is Nothing Then Return False 
    Return ParentsAreEqual(other) AndAlso _worksheet.Name.Equals(other._worksheet.Name) 

End Function 

Private Function ParentsAreEqual(other As Worksheet) As Boolean 

    Dim result As Boolean 
    Try 
     result = _worksheet.Parent.Equals(other._worksheet.Parent) 
    Catch ex As Exception 
     result = False 
    End Try 
    Return result 

End Function 

Public Overrides Function GetHashCode() As Integer 

    Try 
     Return _worksheet.Parent.GetHashCode() Xor _worksheet.Name.GetHashCode 
    Catch ex As Exception 
     Return 42 
    End Try 

End Function 
+1

我最終只檢查工作表名稱,因爲Excel不能有重複的工作表名稱,這對我的情況來說已經足夠了,但這也非常可愛。 – Peroxy