【问题标题】:Assign a type to an object at runtime in vb.net or c#在运行时在 vb.net 或 c# 中为对象分配类型
【发布时间】:2010-11-13 09:13:29
【问题描述】:

我有一个对象 o 和一个类型 T。我想在运行时使用反射将对象 o 更改为类型 T 而无需实例化它。

编译时的等价物是:

Dim p as Point = Nothing

我知道如何在运行时使用 Activator.CreateInstance 创建一个实例,相当于:

Dim p as New Point()

但我不想这样做。我不知道该类型的构造函数参数,并且某些类型没有无参数构造函数。例如。字体。

所以,总而言之,我想要一种执行相当于的方式:

Dim o as T = Nothing

如果您想知道我为什么要这样做,那是因为我在表单上使用 PropertyGrid 来编辑类型。如果这是第一次编辑字体,例如,将未初始化的字体传递给 PropertyGrid 会使网格显示默认值。

干杯。

预计到达时间:

我尝试了“o = GetUninitializedObject(T)”,但 PropertyGrid 要么想要一个正确初始化的对象,要么想要一个具有已定义类型的对象,设置为空。

我实际上已经在这里解决了我的特殊问题:

how-to-use-the-property-grid-in-a-form-to-edit-any-type

,但我仍然想知道如何在不使用包装类的情况下在运行时分配类型(我很幸运能够使用它)。

【问题讨论】:

    标签: vb.net object runtime types casting


    【解决方案1】:

    最接近的方法是将 o 设置为 default(T)。假设默认值不是 Nothing (null),您将获得一个默认值,例如 Rectangle.Empty 或 0 (int)。

    Nothing (null) 没有与之关联的类型,因此如果将 o 作为对象,则 (T) Nothing 将无济于事。

    【讨论】:

    • Dim o as Font = Nothing,确实有与之关联的字体类型。在实例化之前我不能使用它,但我可以将它传递给 PropertyGrid 而不会出错。您能解释一下将 o 设置为默认值(T)是什么意思吗?谢谢。
    • 据我所知,在 VB.Net 中将对象设置为 default(T) 与将其设置为 Nothing。
    • 使用“Dim o as Font = Nothing”,它是 Font 类型的变量 o。无部分不是“无字体”,而是“无对象”。基本上,你必须做一个或另一个,要么变量具有类型(对象不起作用),要么变量内部的值具有类型(什么都不起作用)。如果您在“对象”中有“无”,则它无法知道您的意思。使用包装器可能是您最好的选择。
    猜你喜欢
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多