none
如何反射创建Nullable类型? RRS feed

  • 问题

  •     Nullable<int>不能通过反射创建对象?

    我想分析object对象,将值类型都变成object的nullable类型,怎么做

     

     


    lcpking
    2010年6月10日 15:35

答案

  • 目前,除了我说的用 Activator.CreateInstance<T> 外,尚未发现任何能正常工作的办法。

    从 IL 的角度来讲,Nullable<T> 是值类型,当它被实例化时,IL 上的指令是 initobj,而不是 newobj,所以,这也许是用正常反射不能创建实例的原因之一。


    Mark Zhou
    • 已标记为答案 KeFang Chen 2010年6月21日 6:43
    • 取消答案标记 lcpking 2010年8月18日 12:17
    • 已标记为答案 lcpking 2010年8月18日 12:17
    2010年6月14日 7:38

全部回复

  • 用这个是可以的:

    int? o = Activator.CreateInstance<int?>();

    通过直接的 Activator.CreateInstance(Type type) 是无法创建 Nullable 类型的实例的。 两者的实现代码略有不同。

    主要的 trick 在于 System.RuntimeType.CreateInstanceDefaultCtor(bool, bool, bool, bool) 方法。注意,这个类型是不可见的。


    Mark Zhou
    2010年6月11日 10:02
  •  感谢你的回复,object只能用GetType才能确定类型,System.RuntimeType不可见不能使用CreateInstanceDefaultCtor?

    我该如何做能说的具体点吗?


    lcpking
    2010年6月11日 17:12
  • 希望有人能给出一个准确的做法,我也遇到相同的问题!
    2010年6月13日 9:16
  • 目前,除了我说的用 Activator.CreateInstance<T> 外,尚未发现任何能正常工作的办法。

    从 IL 的角度来讲,Nullable<T> 是值类型,当它被实例化时,IL 上的指令是 initobj,而不是 newobj,所以,这也许是用正常反射不能创建实例的原因之一。


    Mark Zhou
    • 已标记为答案 KeFang Chen 2010年6月21日 6:43
    • 取消答案标记 lcpking 2010年8月18日 12:17
    • 已标记为答案 lcpking 2010年8月18日 12:17
    2010年6月14日 7:38