2016-03-03 104 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