代码之家  ›  专栏  ›  技术社区  ›  kpollock

在C 2.0中使用invoke调用时,参数从null转换为datetime.minvalue

  •  4
  • kpollock  · 技术社区  · 16 年前

    我有点像这样的代码

    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);
    

    但当从isvaliday方法中调用该方法时,日期为datetime.minvalue。这看起来很奇怪-我可能希望抛出NullReferenceException,但不是自动转换。

    如果您想知道,这是单元测试中的代码。(在使用中,该方法通常通过接受对象的公共方法调用)。

    至于后来被调用的其他代码,datetime.minvalue和null不是一回事,所以有点问题。

    有什么线索吗??建议。

    6 回复  |  直到 16 年前
        1
  •  3
  •   dtb    16 年前

    MSDN :

    此数组中没有用值显式初始化的任何对象都将包含该对象类型的默认值。对于引用类型元素,此值为空。 对于值类型元素,此值为0、0.0或false,具体取决于特定的元素类型。

    默认值为 DateTime DateTime.MinValue :

    DateTime.MinValue == new DateTime() // true
    

    这就解释了为什么 日期时间.minvalue 当您使用 null .

    注意你不能通过 无效的 当您在不进行反射的情况下调用该方法时:

    DateTime dt = null; // cannot assign null to value type
    obj.IsValidDay(ref dt);
    

    所以我认为您不需要使用空引用测试方法。


    如果你想让你的方法接受 无效的 ,您可以将声明更改为 DateTime? 正如其他人已经指出的那样:

    private bool IsValidDay(ref DateTime? dt) { ... }
    
        2
  •  3
  •   kemiller2002    16 年前

    日期时间变量不能为空。它不是引用类型,因此不会出现空引用异常。

    你可以这样做:

    private bool IsValidDay(ref DateTime? theDate)
    {
       if(theDate.HasValue)...
    }
    

    下面是一个关于可空类型的链接: http://msdn.microsoft.com/en-us/library/1t3y8s4s%28VS.80%29.aspx

    我想我明白你的要求了……在代码的情况下(特别是由于ref参数的原因,不能对带有ref或out的参数有差异)。它必须传递一个日期时间对象。它不能是其他任何东西…..因此必须将空参数转换为某些内容才能使函数工作。

        3
  •  2
  •   Brett Veenstra    16 年前

    DateTime 有价值,我建议你用 DateTime? (或) Nullable<DataTime> )支持空值

        4
  •  1
  •   AlexD    16 年前

    invoke()方法获取目标方法参数的值数组。根据msdn,与 裁判 参数将用默认值初始化(在这种情况下 日期时间.minvalue )在目标方法调用之前。

    此外,参数数组中与 裁判 参数将在目标方法调用后更新。

    在您的情况下,您不应该使用 无效的 值,因为它不是 日期时间 数据类型。

    这是来自msdn库中invoke方法文档的注释:

    “如果此实例表示的方法或构造函数接受一个ref参数,则该参数不需要任何特殊属性,以便使用此函数调用该方法或构造函数。 此数组中没有用值显式初始化的任何对象都将包含该对象类型的默认值。 对于引用类型元素,此值为空。 对于值类型元素,此值为0、0.0或false,具体取决于特定的元素类型。 他说:“这是一个很好的选择。”

    还找到了本教程: Passing "ref" Parameters

        5
  •  0
  •   C. Ross trotttrotttrott    16 年前

    只有 reference types 可以为空。 DateTime (像int、bool、structs和enums)是 Value Type . 因此,datetime不能为空,就像枚举不能为空一样。你可以使用 Nullable generic ,声明为 DateTime? .这将允许您检查它是否为空。

        6
  •  -1
  •   kpollock    16 年前

    最后,在本例中,我认为我将继续这样一个概念,即方法实际上不需要测试,而不是空值,并且请注意,通过反射调用方法并不总是在直接函数调用时抛出异常。

    其他人可能会发现可以为空的类型建议是有用的(尽管我认为到目前为止,每个人都在继续使用这些建议…)