我有一个对象,o和一个类型T.我想使用反射将对象o更改为在运行时键入T而不实例化它。
编译时的等价物是:
Dim p as Point = Nothing
我知道如何使用Activator.CreateInstance在运行时创建一个等同于:
的实例Dim p as New Point()
但我不想这样做。我不知道类型的构造函数参数,有些类型没有无参数构造函数。例如。字体。
所以,总而言之,我想要一种表现相同的方法:
Dim o as T = Nothing
如果您想知道我为什么要这样做,那是因为我在表单上使用PropertyGrid来编辑类型。如果这是第一次编辑,比如一个Font,那么将未初始化的Font传递给PropertyGrid会使网格显示默认值。
干杯。
ETA:
我试过'o = GetUninitializedObject(T)',但是PropertyGrid想要一个正确初始化的对象或一个定义类型的对象设置为空。
我实际上在这里解决了我的特殊问题:
how-to-use-the-property-grid-in-a-form-to-edit-any-type
,但我仍然有兴趣知道如何在不使用包装类的情况下在运行时分配类型(我很幸运能够使用它)。
答案 0 :(得分:2)
最接近的是将o设置为默认(T)。假设默认值不是Nothing(null),您将获得一个默认值,例如Rectangle.Empty或0(int)。
Nothing(null)没有与之关联的类型,所以如果o作为对象,(T)什么都没有帮助。