C# Excel工作表对象不等于同一工作表对象
守则第一部分:C# Excel工作表对象不等于同一工作表对象,c#,excel,vba,C#,Excel,Vba,守则第一部分: activeWorksheet = Globals.ThisAddIn.Application.ActiveSheet; var allWorksheets = new List<Worksheet>(); 但是,当我在后台将其作为任务运行时,它不起作用。当我执行最后一次比较时,它返回false,即使它打印了Sheet1和Sheet1 new Task(() => { allWorksheets.Add(activeWorksheet); De
activeWorksheet = Globals.ThisAddIn.Application.ActiveSheet;
var allWorksheets = new List<Worksheet>();
但是,当我在后台将其作为任务运行时,它不起作用。当我执行最后一次比较时,它返回false
,即使它打印了Sheet1和Sheet1
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中的工作表是否存在一些奇怪的背景行为?我暂时求助于比较工作表名称,但这是否有效?我也遇到了类似的问题。我为
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
还可以通过检查工作簿名称来概括对象比较。否则,如果两个打开的工作簿具有相同的工作表名称,则可能会得到错误的结果。下面是一个简单的函数:
Function Worksheet_is_worksheet(sh1 As Worksheet, sh2 As Worksheet) As Boolean
'Function to circumvent (known but unresolved) issues with object comparison for
'worksheets
Worksheet_is_worksheet = (sh.Name = sh2.Name) And _
(sh.Parent.Name = sh2.Parent.Name)
End Function
你能发更多的代码吗?
activeWorksheet
是如何声明的/在哪里?它是如何设置的?所有工作表都有同样的问题。我只能猜。。。在这里,编译器关闭在lambda表达式之外声明的变量,并且编译器可能必须创建一个包含执行代码所需的所有变量的新类。您必须反编译并观察生成的内容,以便找出上次比较返回false的原因。我有一个类似的问题。我认为工作表
没有正确实现Equals方法。因此,如果它是同一个实例,那么它是相等的,但是如果创建了同一工作表的新实例,那么Equals方法返回false。我只是检查了工作表名称,因为Excel不能有重复的工作表名称,这对于我的情况来说已经足够了,但这也很好。
Function Worksheet_is_worksheet(sh1 As Worksheet, sh2 As Worksheet) As Boolean
'Function to circumvent (known but unresolved) issues with object comparison for
'worksheets
Worksheet_is_worksheet = (sh.Name = sh2.Name) And _
(sh.Parent.Name = sh2.Parent.Name)
End Function