我的代码有点像这样
public class MyObject
{
private bool IsValidDay(ref DateTime theDate)
{
...
}
}
MethodInfo[] methods = myObjectInstance.GetType().GetMethod("IsValidDay", BindingFlags.Instance | BindingFlags.NonPublic);
object[] args = { null };
bool val = (bool)method.Invoke(myObjectInstance, args);
但是当从IsValidDay方法内部调用该方法时,theDate为DateTime.MinValue。这看起来非常奇怪--我可能希望抛出一个NullReferenceException,而不是一个自动转换。
如果你想知道,这是单元测试中的代码。(在使用中,该方法通常通过接受对象的公共方法调用)。
至于随后调用的其他代码,DateTime.MinValue和null不是一回事,所以这是一个小问题。
有什么线索吗?建议。
发布于 2009-12-14 11:02:27
最后,在这种情况下,我认为我将采用方法实际上不需要测试与null的概念,并注意到通过反射调用方法并不总是抛出异常,而直接的函数调用会抛出异常。
其他人可能会发现nullable类型的建议很有用(尽管我想现在每个人都已经理解这些了……)
发布于 2009-12-11 17:54:24
DateTime变量不能为null。它不是引用类型,所以不会有空引用异常。
你可以这样做:
private bool IsValidDay(ref DateTime? theDate)
{
if(theDate.HasValue)...
}
这里有一个关于可空类型的链接:http://msdn.microsoft.com/en-us/library/1t3y8s4s%28VS.80%29.aspx
我想我明白你的要求了.在你的代码中(特别是因为有ref参数,你不能用ref或out来改变参数)。它必须传入一个DateTime对象。它不能是任何空参数,必须将else.....so参数转换为某个值才能使函数工作。
发布于 2009-12-11 18:02:42
来自MSDN
此数组中未显式初始化的任何对象都将包含该对象类型的默认值。对于引用类型的元素,此值为null。对于值类型元素,此值为0、0.0或false,具体取决于特定的元素类型。
DateTime
的缺省值为DateTime.MinValue
DateTime.MinValue == new DateTime() // true
这就解释了为什么在使用null
调用方法时,DateTime.MinValue
会被传递给该方法。
请注意,当您在没有反射的情况下调用方法时,无论如何都不能将null
传递给该方法:
DateTime dt = null; // cannot assign null to value type
obj.IsValidDay(ref dt);
所以我认为你不需要用引用来测试你的方法。
如果您希望您的方法接受null
,您可以将声明更改为DateTime?
,正如其他人已经指出的那样:
private bool IsValidDay(ref DateTime? dt) { ... }
https://stackoverflow.com/questions/1889749
复制