我正在写一个小VBA IDE插件,并有一个名为AssertClass
一个COM可见的C#类,用AreEqual
方法是这样的:如果我不想要类型安全?
public void AreEqual(object value1, object value2, string message = null)
{
if (value1.Equals(value2))
{
AssertHandler.OnAssertSucceeded();
}
else
{
AssertHandler.OnAssertFailed("AreEqual", message);
}
}
当客户端VBA代码调用像这样,预期所有作品:
'@TestMethod
Public Sub TestMethod1()
'compares two identical Integer (Int16) values:
Assert.AreEqual 2, 2
End Sub
然而,当客户端VBA代码通过不同类型的,它失败:
'@TestMethod
Public Sub TestMethod2()
'compares identically-valued Long (Int32) and Integer (Int16) values:
Assert.AreEqual CLng(2), 2
End Sub
当TestMethod2
通话Assert.AreEqual
,在.NET代码接收int
和short
- 这是正确的......但我不想把它放在客户端的VBA代码上以确保它传递的是相同的类型 - 我希望所有这些调用导致成功的断言:
Assert.AreEqual CByte(2), 2 'fails
Assert.AreEqual CInt(2), 2 'passes
Assert.AreEqual CLng(2), 2 'fails
Assert.AreEqual CSng(2), 2 'fails
Assert.AreEqual CDbl(2), 2 'fails
Assert.AreEqual CCur(2), 2 'fails
毕竟,VBA是没有那么严格的C#,当涉及到类型安全和平等检查:
?CByte(2) = 2, CInt(2) = 2, CLng(2) = 2, CSng(2) = 2, CDbl(2) = 2, CCur(2) = 2
True True True True True True
我怎样才能制定我AreEqual
C#功能,从而...不知何故避免强迫在VBA客户端代码中输入安全性?我不能假设VBA客户端代码将传递数值 - 该方法还需要使用String
和Date
值。
我很难过。我唯一的选择是证明类型的问题?
在VS 2013 Express中使用C#4.5。
不要带走你想要完成的任何事情,也许这对你的设计完全不起作用,但为什么不用像'Assert.IsTrue()'这样更通用的方法呢?然后你的VBA示例应该可以工作:'Assert.IsTrue(CByte(2)= 2)' – TyCobb 2014-11-05 03:47:17
@TyCobb AssertClass具有AreEqual,AreNotEqual,AreNotSame,AreSame,Fail,InConclusive ','IsFalse','IsNothing','IsNotNothing'和'IsTrue'方法。只有'AreEqual'(和'AreNotEqual')是有问题的;我忽略了其他的方法,以便brievety;) – 2014-11-05 03:49:33