C# 如果我没有';我不想要类型安全?
我正在编写一个小小的VBA IDE插件,其中有一个COM可见的C#类,名为C# 如果我没有';我不想要类型安全?,c#,vba,com-interop,equality,type-safety,C#,Vba,Com Interop,Equality,Type Safety,我正在编写一个小小的VBA IDE插件,其中有一个COM可见的C#类,名为AssertClass,其AreEqual方法如下: public void AreEqual(object value1, object value2, string message = null) { if (value1.Equals(value2)) { AssertHandler.OnAssertSucceeded(); } else { A
AssertClass
,其AreEqual
方法如下:
public void AreEqual(object value1, object value2, string message = null)
{
if (value1.Equals(value2))
{
AssertHandler.OnAssertSucceeded();
}
else
{
AssertHandler.OnAssertFailed("AreEqual", message);
}
}
当客户端VBA代码这样调用它时,所有操作都按预期进行:
”@TestMethod
公共子测试方法1()
'比较两个相同的整数(Int16)值:
断言。等于2,2
端接头
但是,当客户端VBA代码传递不同类型时,它会失败:
”@TestMethod
公共子测试方法2()
'比较相同值的长(Int32)值和整数(Int16)值:
Assert.AreEqual CLng(2),2
端接头
当
TestMethod2
调用Assert.AreEqual
时,.NET代码接收一个int
和一个short
-这是正确的。。。但我不想将其放在客户端VBA代码上,以确保它传递相同的类型-我希望所有这些调用都会导致后续断言:
Assert.AreEqual CByte(2),2'失败
Assert.AreEqual CInt(2),2'通道
Assert.AreEqual CLng(2),2'失败
Assert.AreEqual CSng(2),2'失败
Assert.AreEqual CDbl(2),2'失败
Assert.AreEqual CCur(2),2'失败
毕竟,VBA在类型安全和平等性检查方面没有C#严格:
CByte(2)=2,CInt(2)=2,CLng(2)=2,CSng(2)=2,CDbl(2)=2,CCur(2)=2
真的真的真的真的
我如何制定我的
AreEqual
C#函数以便。。。以某种方式避免在VBA客户端代码中强制使用类型安全性?我不能假设VBA客户端代码将传递数值-该方法还需要处理String
和Date
值
我被难住了。我唯一的选择是记录类型的重要性吗
在VS 2013 Express中使用C#4.5。这有点像是在黑暗中拍摄的(VBA和C#组合不起作用),但试试看它是否有效:
public void AreEqual(object value1, object value2, string message = null)
{
bool convertedOk = true;
object value2Converted;
try
{
value2Converted = Convert.ChangeType(value2, value1.GetType());
}
catch
{
convertedOk = false;
}
if (convertedOk && value1.Equals(value2Converted))
{
AssertHandler.OnAssertSucceeded();
}
else
{
AssertHandler.OnAssertFailed("AreEqual", message);
}
}
其思想是,您将第二个值的类型更改为第一个值的类型,以便它们现在变得“更兼容”,以便进行比较
编辑:
根据评论建议,使用try/catch处理更新了答案。谢谢 不要带走您试图完成的任何东西,也许这对您的设计根本不起作用,但是为什么不使用一个更通用的方法,比如
Assert.IsTrue()
?然后您的VBA示例应该可以工作:Assert.IsTrue(CByte(2)=2)
@TyCobbAssertClass
具有AreEqual
,arenequal
,不相同
,arame
,不确定
,为假
,为零
,isnothing
和IsTrue
方法。只有AreEqual
(和AreNotEqual
)是有问题的;我省略了brievety的其他方法;)当然,转换它!(facepalm)…现在实际的修复需要一个try/catch
块来确保转换确实是可能的,但这个答案肯定让我走上了正确的道路。谢谢有趣的答案。如果值2无法转换,这可能需要包装在一个try块中。注意:在仔细考虑之后,我将保持AssertClass
方法类型安全。非常简单,没有副作用,也没有边缘情况。考虑<代码> Acess 300,CByte(30)<代码>与<代码> AreEqual CByte(30),300 < /代码> -一个吹,另一个通过。我甚至没有提到转换后的布尔值会发生什么。。